MSBuild - 尝试构建项目引用时的竞争条件

时间:2017-05-05 19:49:11

标签: msbuild race-condition project-reference parallel-builds msbuild-projectreference

我在尝试使用MSBuild进行构建时遇到了一个奇怪的问题。

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

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

知道为什么MSBuild会这样做吗?

1 个答案:

答案 0 :(得分:1)

终于找到了我的问题的解决方案

MSBuild期望以两种方式添加项目依赖性 1.在vcxproj本身中,添加所有依赖项目引用
2.在sln文件中,定义项目依赖项。

以下VS博客实际上反过来说 - 例如 - https://blogs.msdn.microsoft.com/vcblog/2010/02/16/project-settings-changes-with-vs2010/表示项目依赖项和项目引用是类似的,只使用一个特定的项目引用。

使用VS IDE构建时可能会出现这种情况,但对于MSBuild则不行。它需要在 ProjectReference ProjectDependencies 上定义项目依赖项。

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