我有一个项目(让我们称之为a.csproj
),它有一些二进制项目被复制到输出目录。例如:
<ItemGroup>
<Content Include="$(ReferenceDir)\7z.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
我有第二个项目(我们称之为b.csproj
)恰好依赖于相同的二进制项。因此b.csproj
还包含<Content>
中的<ItemGroup>
项。
我有第三个项目,它取决于a.csproj
和b.csproj
。我开始构建这个项目:
PS> MSBuild.exe c.csproj /p:Platform=x86`;Configuration=Release /m
当我这样做时,两个依赖项都尝试并行构建。结果,他们都试图将同一个文件复制到同一个输出位置,这会导致构建随机失败。
我可以使用某种机制向MSBuild声明我只使用其中一个副本吗? (似乎没有问题避免使用复杂的依赖图重建.csproj
es;所以我希望在这里使用相同的机制)
答案 0 :(得分:0)
你确定这就是它的全部吗?原因是,_CopyFilesMarkedCopyLocal
目标不可并行化,它收集所有复制本地项目,并在一个步骤中执行一个最终复制,顺序,不应该有任何锁定。如果你用全局属性覆盖OutputPath
并强制将它们中的每一个构建到同一个文件夹中,那么,这就是并行化的现实,你无法绕过它,但取决于哪个版本的您正在使用的MSBuild和Microsoft.Common.targets
可以使用CopyRetryCount
任务中使用的CopyRetryDelayMilliseconds
和Copy
属性来启动锁定或尝试各种CreateHardLinksFor*
,例如CreateHardLinksForAdditionalFilesIfPossible