如何在nuspec中指定特定的依赖版本?


81

我正在创建我的第一个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,而是无关的软件包。如果上游库中有真正的重大更改,则可能需要锁定版本,但在我们看来,我们没有这样做。只是过度使用了这种语法。因此,如果您使用它,请谨慎使用!
安东尼

Answers:


129

您应该能够使用括号来强制使用确切的版本:

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

有关可以使用的格式的完整信息,请访问NuGet网站,网址为:

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


我不知道我怎么找不到那个页面!谢谢。
devlife 2011年

1
你可以这样做。但是请记住,任何使用您的软件包并同时使用NHibernate的人,都无法以任何理由更新NHibernate,除非您允许他们。这不是一个大问题。
安东尼

2
@Anthony我认为这条评论比我的回答更好。我只是展示如何做到这一点,而不是提倡它。您描述的问题虽然不容易解决;如果您有很多无法使用相同版本的NH的代码(由于错误,API差异等原因),那么您已经被搞砸了。真正的解决方法是私有依赖项(例如Node拥有的),但是我看不到.NET对此有“适当的”支持:(
Danny Tuppeny

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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.