7

私のチームには大規模なソリューション (〜 500 csproj) があります。VS2012 を使用し、MSBuild 4 を使用する TFS Build を使用してビルドします。現在はシリアルでビルドしていますが、並行してビルドしたいと考えています ( を使用msbuild /maxcpucount:4)。ただし、4 プロセッサのマシンで試してみると、奇妙なエラーが発生します。

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 が同じプロジェクトを 2 回ビルドしようとするのはなぜですか?

4

2 に答える 2

5

原因:だれかが を呼び出して<MSBuild Projects="Common.csproj" Properties="..." />いました。次に、MSBuild はそれらの異なるプロパティを使用して Common.csproj を再度ビルドする必要があると考え、たまたま Common.csproj の通常のコンパイルと同時に発生しました。

修正:<MSBuild ... />これらの不要なプロパティを指定せずに呼び出します。

テスト:

Common.targets

<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>

その他のターゲット

<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 に答える