如何调试 MSBuild 依赖项问题?

3

我们有一个混合的C#和C++/CLI解决方案。使用devenv构建可以正常工作,通过

msbuild /nr:false /t:Rebuild /p:Configuration=Release /p:Platform=x64 Solution.sln

在添加 /m 后,程序可以正常工作,但是会出现失败。例如使用 cl 或 link 命令时,由于 .pch 或 .obj 文件已在使用中,导致命令执行失败。

通过诊断输出,我发现某些项目由于某种原因被多次构建:

1>Project "Solution.sln" (1)
is building "a.vcxproj" (34) on node 2 (default targets).
34>Project "a.vcxproj" (34)
is building "b.vcxproj" (43:2) on node 5 (default targets).
33>Project "c.csproj" (33)
is building "c.csproj" (33:2) on node 6 (ResolveReferences;_CopyFilesMarkedCopyLocal target(s)).
33:2>Project "c.csproj" (33:2)
is building "d.csproj" (41) on node 2 (default targets).
41>Project "d.csproj" (41)
is building "d.csproj" (41:2) on node 2 (ResolveReferences;_CopyFilesMarkedCopyLocal target(s)).
41:2>Project "d.csproj" (41:2)
is building "b.vcxproj" (43) on node 2 (default targets).

.

1>Project "Solution.sln" (1)
is building "e.vcxproj" (60) on node 5 (default targets).
1>Project "Solution.sln" (1)
is building "f.csproj" (69) on node 6 (default targets).
69>Project "f.csproj" (69)
is building "f.csproj" (69:2) on node 6 (ResolveReferences;_CopyFilesMarkedCopyLocal target(s)).
69:2>Project "f.csproj" (69:2)
is building "e.vcxproj" (60:2) on node 6 (default targets).

但我不知道为什么当devenv能够正确获取依赖项时它会表现出这种行为。

有人知道其他的开关/工具/或者需要在日志中查找什么来解决这个问题吗?


你是如何设置 /M 值的?如果只使用类似于 msbuild xxx.proj /maxcpucount:3 这样的进程,结果如何?/ds 将提供详细摘要,您也可以在您的端上检查它。请还要检查该问题的构建顺序(多次构建):https://blogs.msdn.microsoft.com/visualstudio/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exe/ - Jack Zhai
/m 使用了8个实例,但使用 /m:2 也会发生,只是概率较小。 我想我以前读过那篇文章。我们没有任何 .sln 文件 ProjectDependencies。关于64位MSBuild版本的段落仍然有效吗? - Trass3r
至少我无法在一个小的混合测试解决方案中重现它。一定有什么特别的原因。它会自动选择64位的MSBuild。 - Trass3r
现在你更改了包后它能正常工作,是吗?如果是这样,你可以将其发布为答案并标记。这将有助于遇到相同问题的其他社区成员。祝你有美好的一天:) - Jack Zhai
如果你在.tt文件中从同一解决方案的另一个项目引用,会出现一些问题,因为转换发生在依赖项构建之前,即使项目引用已经正确设置。将<TransformOnBuild> true </ TransformOnBuild>替换为<Target Name =“CustomTransformOnBuild” BeforeTargets =“MarkupCompilePass1”> ...似乎适用于x64,但不适用于x86。 - Trass3r
显示剩余3条评论
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接