7

我的团队有一个大型解决方案(约 500 个 csproj)。我们使用 VS2012,并使用 TFS Build 构建,它使用 MSBuild 4。目前我们串行构建,但我们希望并行构建(使用msbuild /maxcpucount:4)。然而,当我在我的 4-proc 机器上尝试它时,我遇到了一个奇怪的失败:

11:2>CSC : fatal error CS0042: Unexpected error creating debug information file 'C:\Common\obj\Debug\Common.PDB' -- 'C:\Common\obj\Debug\Common.pdb: The process cannot access the file because it is being used by another process. [C:\Common\Common.csproj]

查看日志,2 个 msbuild 节点试图构建相同的 csproj,因此在写入一些输出时发生冲突:

10>Project "C:\Utils\Utils.csproj" (10) is building "C:\Common\Common.csproj" (11) on node 4 (default targets).
46:2>Project "C:\Objects\Objects.csproj" (46:2) is building "C:\Common\Common.csproj" (11:2) on node 1 (default targets).

为什么 MSBuild 会尝试两次构建同一个项目?

4

2 回答 2

5

原因:有人打电话<MSBuild Projects="Common.csproj" Properties="..." />。然后,MSBuild 认为应该用那些不同的属性重新构建 Common.csproj,而它恰好与 Common.csproj 的常规编译同时发生。

修复:<MSBuild ... />在没有那些不需要的属性的情况下调用。

测试:

公共目标

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Build">
    <Message Importance="high" Text="Build in $(MSBuildThisFile)" />
  </Target>
  <Target Name="After" DependsOnTargets="Build">
    <Message Importance="high" Text="After in $(MSBuildThisFile)" />
  </Target>
</Project>

其他.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Build">
    <Message Importance="high" Text="Build in $(MSBuildThisFile)" />
    <MSBuild Projects="common.targets" Targets="Build" />   <!-- regular builds -->
    <MSBuild Projects="common.targets"                      <!-- custom invocation with properties -->
             Targets="After"
             Properties="myprop=myvalue"
             />
  </Target>
</Project>

跑:

> msbuild other.targets /clp:verbosity=minimal
  Build in other.targets
  Build in common.targets
  Build in common.targets    <<<< Common.targets Build is invoked again
  After in common.targets

事实上,删除Properties="myprop=myvalue"解决了这个问题。

于 2013-07-01T15:39:30.157 回答
1

我发现有人添加了两个项目引用(来自同一个项目),这显然导致 msbuild 也构建了两次.. 需要注意的地方

于 2021-12-14T18:20:45.127 回答