Як вказати конкретну версію залежності в 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)'.


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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.