Msbuild TeamCity-Microsoft.Bcl.Build依赖项

Msbuild TeamCity-Microsoft.Bcl.Build依赖项,msbuild,teamcity,nuget,Msbuild,Teamcity,Nuget,我刚刚将一些代码更改提交到我的存储库中,突然之间(经过几周的调整)。TC版本开始失败,因为它无法下载适用于Microsoft.Bcl.build.1.0.6的NuGet软件包 我最终不得不手动将packages目录的内容复制到TC构建位置,这完全违背了NuGet的观点 我可以检查什么来找出这一问题的根本原因 在获取软件包的解决方案中启用了有关NuGet的所有内容。好的,这是一个有点棘手的问题 如果您遇到这个问题,您需要对存储库执行一些非常糟糕的操作 确保您正在签入packages\reposit

我刚刚将一些代码更改提交到我的存储库中,突然之间(经过几周的调整)。TC版本开始失败,因为它无法下载适用于Microsoft.Bcl.build.1.0.6的NuGet软件包

我最终不得不手动将packages目录的内容复制到TC构建位置,这完全违背了NuGet的观点

我可以检查什么来找出这一问题的根本原因


在获取软件包的解决方案中启用了有关NuGet的所有内容。

好的,这是一个有点棘手的问题

如果您遇到这个问题,您需要对存储库执行一些非常糟糕的操作

确保您正在签入
packages\repositories.config
文件

然后,如果您的生成因对Microsoft.Bcl.build的未解析引用而失败,则还需要签入此包的
.targets
文件。例如:

package\Microsoft.Bcl.Build.x.x.x\tools\Microsoft.Bcl.Build.targets

可怕的…

我在博客上写过这个问题。总结一下,NuGet包还原(2.7之前)是作为MSBuild构建过程的一部分实现的。当MSBuild启动生成时,它将计算项目文件和导入其他文件的任何导入声明。这发生在任何目标执行之前

由于NuGet pkg restore是构建过程的一部分,.targets文件在Import语句无法产生任何影响的时间点恢复

您可以通过如下所述签入.targets文件或在构建过程之前调用pkg restore来解决此问题。我已经创建了一个NuGet包,它可以帮助使用后一种方法

要使用PackageStore,只需将NuGet软件包添加到项目中,该软件包将在项目目录中自动创建一个名为PackageStore.proj的文件。配置生成时,您需要在.sln/.csproj文件之前生成该项。

我认为(但不确定,所以我创建了这个问题:)Microsoft.Bcl.build仅用于开发,而在生成服务器上不需要。因此,我有一个Builder.targets文件,它只存在于构建环境中,它间接地
嵌入到我们的所有项目中,其中包括以下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中的绑定重定向,并确保项目中包含可传递的依赖项,因此将其保留下来以供开发非常重要。但我目前还没有意识到在构建服务器环境中需要它。

这篇博文是我见过的解释解决方案选项最全面的博文:

在国际海事组织,没有一个是好的——这个问题仍然需要更好的解决方案


但目前,最好的建议是将Bcl.Build.targets文件检查到源代码管理中,这意味着当更新Bcl.Build版本时,您需要添加新的.targets文件,并删除旧的文件。

有趣的方法是检查它。谢谢