如何配置msbuild来处理多个项目共享的二进制依赖项?

时间:2014-07-23 01:59:41

标签: msbuild

我有一个项目(让我们称之为a.csproj),它有一些二进制项目被复制到输出目录。例如:

<ItemGroup>
  <Content Include="$(ReferenceDir)\7z.dll">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

我有第二个项目(我们称之为b.csproj)恰好依赖于相同的二进制项。因此b.csproj还包含<Content>中的<ItemGroup>项。

我有第三个项目,它取决于a.csprojb.csproj。我开始构建这个项目:

PS> MSBuild.exe c.csproj /p:Platform=x86`;Configuration=Release /m

当我这样做时,两个依赖项都尝试并行构建。结果,他们都试图将同一个文件复制到同一个输出位置,这会导致构建随机失败。

我可以使用某种机制向MSBuild声明我只使用其中一个副本吗? (似乎没有问题避免使用复杂的依赖图重建.csproj es;所以我希望在这里使用相同的机制)

1 个答案:

答案 0 :(得分:0)

你确定这就是它的全部吗?原因是,_CopyFilesMarkedCopyLocal目标不可并行化,它收集所有复制本地项目,并在一个步骤中执行一个最终复制,顺序,不应该有任何锁定。如果你用全局属性覆盖OutputPath并强制将它们中的每一个构建到同一个文件夹中,那么,这就是并行化的现实,你无法绕过它,但取决于哪个版本的您正在使用的MSBuild和Microsoft.Common.targets可以使用CopyRetryCount任务中使用的CopyRetryDelayMillisecondsCopy属性来启动锁定或尝试各种CreateHardLinksFor*,例如CreateHardLinksForAdditionalFilesIfPossible