Nuget为项目中的程序集创建特定版本的引用

时间:2013-07-31 15:54:02

标签: c# visual-studio nuget build-automation nuget-package

我的团队遇到了一个问题,当使用Nuget进行包管理时,它会在我的项目中创建对dll的特定版本的引用。有没有办法阻止Nuget创建这些紧密耦合的引用?

有点背景。

我们正在使用nuget来管理我们的内部共享库。通常使用VS UI安装软件包。 Nuget包是使用.csproj文件中的nuget.exe规范和nuget.exe包创建的。

我们使用主干开发的标准分支策略在主干上完成并释放rc分支。

我们不想通过命名所有软件包x.y.z-build123进入版本控制地狱,因为开发人员可能需要在我们的CI系统之外进行本地构建并使用它来测试下游解决方案。我们的答案是通过说所有主干版本只是xyz-staging来简化我们的包版本,然后将rc构建命名为xyz这将使dev能够进行本地构建并在nuget.exe安装的帮助下指向dev的机器上的存储库使用它们在下游解决方案中的构建。无需更新包等。

我们看到的问题是虽然这在包级别上运行良好。构建失败,因为项目中的引用是程序集的特定文件版本。在本地开发版本中哪个不包含内部版本号,但在CI服务器上它将包含。

项目的引用类似于以下内容。

    

版本(123)的内部版本号部分在CI服务器上与本地开发机器不同,通常为0。

有没有办法让nuget创建与版本无关的引用,例如只是汇编名称而不是这个几乎强大的名称。

2 个答案:

答案 0 :(得分:1)

看来我找到了解决方法。

我创建了一个新的控制台项目,试图重新创建该问题。添加了我最初使用的软件包,它是在没有版本信息的情况下添加的!

我在上一个项目中看不到任何奇怪的设置,所以开始乱搞。我能够通过以下步骤重新创建该问题。 1)将nuget包添加到您的项目中 2)建立 3)卸载nuget包 4)重新安装nuget包

第4步使用版本信息将软件包安装到您的项目中。

这一切归结为,如果您的bin文件夹中已有程序集并且您尝试添加(或卸载并重新安装),则新的引用将添加到包含版本信息的项目中。

解决方案是确保在处理nuget之前始终清理解决方案。

答案 1 :(得分:0)

可以通过项目上的binding redirects来制作技巧。

但请注意,具有相同ID和版本的两个NuGet包被认为是相同的包,这是按设计

考虑这种情况:

  • 您从变更集1
  • 发布了一个包“foo.1.2.3-staging”
  • 我在我的解决方案中安装
  • 您从变更集2发布了一个包“foo.1.2.3-staging”(可能是一个错误修正)
  • 我的NuGet永远不会通知更新,更糟糕的是,在我的机器上构建的每个解决方案中,它将继续使用旧的(缓存)版本

所以你强迫开发人员在每次构建解决方案时清除NuGet缓存,只是为了确保他们使用“真实”版本