我们有两个独立的 .NET 解决方案:
- 为第一个解决方案运行构建会产生我们的最终产品:一堆 DLL。这些 DLL 通过 NuGet 包交付给我们的客户。
- 第二种解决方案用作产品测试解决方案:将 NuGet 包安装到其中,并构建和执行它 - 因此它使用我们的产品的方式与我们的客户使用的方式完全相同。
这里的挑战是我们最新的 NuGet 包应该有一种自动安装到产品测试解决方案的方法,最好是在构建这个产品测试解决方案的过程中。
基于来自类似问题的想法,我在配置产品测试解决方案方面取得了进展:
- 首先,我启用了 NuGet 包还原。这让我完全摆脱了 VCS 中的“packages”目录,因为具有 packages.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 包更新到最新版本吗?