在构建期间无法自动将NuGet包更新到最新版本

rem*_*ark 15 teamcity build visual-studio nuget

我们有两个独立的.NET解决方案:

  • 运行第一个解决方案的构建产生我们的最终产品:一堆DLL.这些DLL通过NuGet包提供给我们的客户.
  • 第二个解决方案用作产品测试解决方案:NuGet包安装在其上,并且构建和执行 - 因此它使用我们的产品与客户的方式完全相同.

这里面临的挑战是,应该有一种方式将我们最新的NuGet软件包自动安装到产品测试解决方案中,最好是在构建此产品测试解决方案期间.

基于类似问题的想法,我在配置产品测试解决方案方面做到了这一点:

  • 首先我启用了NuGet Package Restore.这使我可以完全从VCS中删除"packages"目录,因为在build.config文件中定义的版本的包将在构建之前由NuGet自动下载.
  • 然后我在Visual Studio中添加了以下预构建事件:$(SolutionDir).nuget\nuget update -prerelease $(ProjectDir)packages.config.这让我可以在构建期间引入最新版本的NuGet包.

我目前使用上面的场景使用Visual Studio运行本地构建,使用TeamCity运行无人参与的构建.该解决方案似乎第一眼就适用于这两种情况,但实际上它并没有产生预期的结果:当构建产品测试解决方案时,在bin目录中我没有获得最新版本的DLL,只有最新版本-1版本.

问题是虽然nuget update命令按预期更新了所有内容,包括文件packages.config.csproj文件,但它们的新内容不会被构建选中,因此 - 正如我的猜测 - 文件中的HintPath设置.csproj仍然反映了"构建前"状态因此旧的DLL被复制到bin目录中.我假设.csproj文件只处理一次:在触发预构建事件之前,预构建事件所做的更改将被忽略,直到下一次构建.

我考虑了以下解决方案:

  • 显然,预构建不够"预先".如果有一个更早的点我可以插入nuget update命令,我的上述解决方案可能会工作.
  • 我读到我可以通过定义ReferencePath来覆盖.csproj文件中的HintPath-s.但是我怀疑我能否轻松找出正确的路径,或者我可以尽早设置它以便构建能够找到它.
  • 作为一种解决方法,我可以运行构建两次:在TeamCity中复制产品测试解决方案的构建步骤,我总是可以在Visual Studio中本地构建解决方案两次.

有人想出如何在构建期间自动将NuGet包更新到最新版本?

bc3*_*ech 6

看一下我刚才关于这个过程的博客文章.我没有在服务器上配置东西,而是通过扩充使用Nuget Package Restore选项实现的Nuget.Targets文件来实现.这种方法的优点是它在本地和服务器上执行(所以你可以在打破构建之前看到任何可能的副作用)

发布详情:http://netitude.bc3tech.net/2014/11/28/auto-update-your-nuget-packages-at-build-time/


Pav*_*shy 4

我认为将自动更新放在预构建步骤中不是 NuGet 风格。你可以理解每次做的时候都需要这个操作。主要是因为它可以增加构建时间。例如,当您使用 TDD 并经常重建项目并运行测试时,您希望它能够快速完成。此外,它可能会更新意外的软件包并破坏某些内容,之后您可能会花费大量时间来查找问题。
我建议将更新作为单独的步骤进行。在 TeamCity 上,您可以使用NuGet installer构建步骤。要执行更新,只需选中步骤配置底部区域中的两个复选框: 在此输入图像描述

此外,如果您希望在成功构建并通过测试后保留更新结果,您可以添加稍后的构建步骤,将这些更改提交到 VCS(例如使用 cmd 或 PowerShell)。
当您在本地工作时,我认为最好的方法是在开始使用项目之前运行一次更新包。您可以使用Package Manager Console命令来实现此目的Update-Package -IncludePrerelease