Как указать конкретную версию зависимости в nuspec?

83

Я создаю свой первый пакет nuget. Я добавил зависимость с версией, которая не является последней. Однако я не хочу обновляться до последней версии этой зависимости. Можно ли указать ему использовать конкретную версию?

<dependencies>
  <dependency id="NHibernate" version="3.2.0.3001" />
</dependencies>

Когда я устанавливаю пакет, я вижу следующее:

Attempting to resolve dependency 'NHibernate (≥ 3.2.0.3001)'.

Когда я устанавливаю пакет, это создает следующее.

<packages>
  <package id="Iesi.Collections" version="3.2.0.4000" />
  <package id="NHibernate" version="3.2.0.4000" />
</packages>

Мне бы очень хотелось увидеть что-то вроде этого: Попытка разрешить зависимость NHibernate (3.2.0.3001).

Devlife
источник
5
Вы можете сделать это, как указано ниже. Но имейте в виду, что любой, кто использует ваш пакет, а также NHibernate (или любую другую зависимость, в которой вы указали точную версию пакета), не может обновить это по какой-либо причине, если вы им не разрешите. Это плохое положение. «Заблокированная версия» недавно укусила нас: в нашем случае пакет с заблокированной версией был не NHib, а не связанным пакетом. Блокировка версии может потребоваться, если есть серьезные критические изменения в вышестоящей библиотеке, но в нашем случае их не было; просто злоупотребление этим синтаксисом. Поэтому, если вы его используете, используйте его с осторожностью!
Энтони

Ответы:

131

Вы должны иметь возможность принудительно указать точную версию с помощью скобок:

<dependency id="NHibernate" version="[3.2.0.3001]" />

Полная информация о форматах, которые вы можете использовать, находится на сайте NuGet здесь:

http://docs.nuget.org/docs/reference/version-range-specification

Дэнни Таппени
источник
Не знаю, как я не нашел эту страницу! Благодарю.
devlife
1
Ты можешь это сделать. Но имейте в виду, что любой, кто использует ваш пакет, а также использует NHibernate, не сможет обновить NHibernate ни по какой причине, если вы им не разрешите. Это не самое лучшее положение вещей.
Энтони
3
@Anthony Я думаю, что этот комментарий лучше моего ответа на вопрос; Я просто показывал, как это делать, а не защищал это. Однако описанную вами проблему решить нелегко; если у вас есть две партии кода, которые просто не работают с одной и той же версией NH (из-за ошибок, различий API и т. д.), то вы уже облажались. Настоящее исправление - это частные зависимости (например, у Node), но я не вижу, чтобы .NET когда-либо получала «правильную» поддержку для этого :(
Дэнни Таппени
1
Да, я согласен и снова прикреплю комментарий. Чтобы быть ясным, "закрытая версия" недавно укусила нас, так что это свежо в моей памяти. В нашем случае пакет с заблокированной версией был не NHib, а совершенно не связанным пакетом. Блокировка версии может потребоваться, если в библиотеке есть серьезные критические изменения, но в нашем случае их не было; просто злоупотребление этим синтаксисом. Так что используйте его с осторожностью!
Энтони
2

Согласно http://nuget.codeplex.com/wikipage?title=Dependency%20Resolution и другим источникам, просто указав нижнюю границу как

<dependencies>
  <dependency id="NHibernate" version="3.2.0.3001" />
</dependencies>

приведет к наивысшему уровню ревизии / исправления самой низкой основной / дополнительной версии, соответствующей этой версии.

Если я полностью не понимаю документацию, это будет соответствовать высшей версии 3.2. *, Но не 3.3. * Или более поздним версиям, если не будет найдена версия 3.2. *.

Если по какой-то причине 3.2.0.3001 является единственной версией, от которой вы хотите зависеть, вы можете обнаружить, что ваш пакет несовместим с другими пакетами, которые также зависят от NHibernate, например, потому что другой пакет зависит от NHibernate [3.2.0.3002 , 3.3), что означает не менее 3.2.0.3002, но ниже 3.3.

Крис Ли
источник