2

我在尝试使用MSBuild构建时遇到了一个奇怪的问题。MSBuild - 尝试构建项目引用时的竞争条件

我正在使用MSBuild构建一个解决方案文件,并将/ m(并行构建)和BuildProjectReferences设置为true。 假设在sln文件中有A.vcxproj和B.vcxproj,B的项目引用为A. 会发生什么事情A项目开始先构建,而在编译过程中,B项目开始构建另一个项目进程(因为并行构建),它会调用building A. 现在这会导致竞争条件,因为我们有两个进程试图构建相同的项目A,我会看到访问问题。

理想情况下,如果A没有完成构建,或者如果确实调用B,那么MSBuild不应该调用构建B,然后检测到A仍在构建并等待它完成。 没有发生这种情况。此外,这只会发生在MSBuild - 如果我尝试从VS2015 IDE构建解决方案文件,则不会发生。

任何想法为什么MSBuild的行为是这样吗?

+0

哪个MsBuild版本,哪个Visual C++版本?这可能会有影响。 – jessehouwing

+0

VS 2015和MSBuild 14.0 – comingbacktolife

回答

1

终于找到了解决我的问题

的MSBuild预计,该项目依赖于两个方面
1.在vcxproj本身添加,添加所有的依赖projectreference
2.在SLN文件太多,定义项目依赖关系。

以下VS博客实际上说明了相反的情况 - 例如 - https://blogs.msdn.microsoft.com/vcblog/2010/02/16/project-settings-changes-with-vs2010/指出项目依赖和项目引用是类似的,并且只使用一个特定的项目引用。

当您使用VS IDE构建而不是MSBuild时,这可能是正确的。它需要在ProjectReferenceProjectDependencies上定义项目相关性。

希望这可以帮助任何人遇到与我一样的问题。