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

MSBuild - race condition while trying to build project references

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

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

理想情况下,如果 A 尚未完成构建,MSBuild 不应调用构建 B,或者如果它调用 B,则检测到 A 仍在构建并等待它完成。 None 发生这种情况。此外,这仅发生在 MSBuild 中 - 如果我尝试从 VS2015 IDE.

构建解决方案文件,则不会发生

知道为什么 MSBuild 会这样吗?

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

MSBuild 希望以两种方式添加项目依赖项
1.在vcxproj本身,添加所有依赖projectreference
2. 同样在sln文件中,定义projectdependencies。

下面的 VS 博客实际上是相反的 - 例如 - https://blogs.msdn.microsoft.com/vcblog/2010/02/16/project-settings-changes-with-vs2010/ 指出 projectdependencies 和 projectreference 是类似的,只使用一个特定的 projectreferences。

当您使用 VS IDE 构建时可能会出现这种情况,但对于 MSBuild 则不然。它需要在 ProjectReferenceProjectDependencies.

上定义项目依赖项

希望这对遇到与我相同问题的任何人有所帮助。