我刚刚对我的存储库进行了一些代码更改,并且突然(经过几周的罚款)。 TC版本开始失败,因为它无法下载Microsoft.Bcl.Build.1.0.6的NuGet包。
我最终不得不手动将packages目录的内容复制到TC构建位置,这完全违背了NuGet的要点。
我可以检查什么才能找到根本原因?
在获取软件包的解决方案中启用了有关NuGet的所有内容。
答案 0 :(得分:4)
我在http://sedodream.com/2012/12/24/SlowCheetahBuildServerSupportUpdated.aspx发表了关于此问题的博文。总结NuGet包恢复(在2.7之前)是作为MSBuild构建过程的一部分实现的。当MSBuild启动构建时,它将评估项目文件和导入其他文件的任何Import声明。这在任何目标执行之前就会发生。
由于NuGet pkg恢复是构建过程的一部分,因此.targets文件会在某个时间点恢复,导致Import语句产生任何影响为时已晚。
您可以通过按照说明检查.targets文件,或者在构建过程之前调用pkg restore来解决此问题。我已经创建了一个NuGet包PackageRestore,它可以帮助我采用后一种方法。
要使用PackageRestore,只需将NuGet包添加到项目中,该项目将自动在项目目录中创建名为packageRestore.proj的文件。配置构建时,需要在.sln / .csproj文件之前构建该项目。
答案 1 :(得分:2)
好的这是一个令人讨厌的问题。
如果您遇到此问题,则需要对存储库执行相当丑陋的操作。
确保您正在检查packages\repositories.config
文件。
然后,如果您的构建失败,并且未解析对Microsoft.Bcl.Build的引用,则还需要检查此程序包的.targets
文件。例如:
package\Microsoft.Bcl.Build.x.x.x\tools\Microsoft.Bcl.Build.targets
丑陋......
答案 2 :(得分:1)
这篇博客文章是我在解释解决方案选项时看到的最全面的文章:
http://blogs.msdn.com/b/dotnet/archive/2013/06/12/nuget-package-restore-issues.aspx
没有什么是伟大的IMO - 这个问题仍然需要一个更好的解决方案。
但目前,推荐的最佳选择是将Bcl.Build .targets文件检查到源代码控制中 - 这意味着当更新Bcl.Build版本时,您需要添加新版本。目标文件,并删除旧文件。
答案 3 :(得分:0)
我认为(但我不确定,因此我创建了这个问题:What does the Microsoft.Bcl.Build NuGet package do?),Microsoft.Bcl.Build仅在开发时需要,并且在构建服务器上不需要。所以,我有一个仅存在于构建环境中的Builder.targets文件,它间接<import>
到我们的所有项目中,其中包括MSBuild xml的这一部分:
<!-- Skip Microsoft.Bcl.Build functionality when building only from Source. Presumably Microsoft.BclBuild is only needed for development. -->
<PropertyGroup>
<BclBuildImported>Ignore</BclBuildImported>
</PropertyGroup>
由于Bcl.Build nuget包插入项目的MSBuild逻辑块依赖于BclBuildImported
属性为空,这有效地回避了我的构建环境中的问题--Microsoft.Bcl.Build步骤被跳过,它不再破坏我的CI构建。
请注意,由于此程序包似乎管理app.config中的绑定重定向,并确保项目中包含传递依赖项,因此进行开发非常重要。但我目前还没有意识到在构建服务器环境中需要它。