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

com*_*ife 5 msbuild project-reference race-condition parallel-builds msbuild-projectreference

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

我正在使用 MSBuild 构建一个解决方案文件/m(并行构建)并BuildProjectReferences设置为true.

假设我在 .sln 文件中拥有A.vcxproj和 ,B.vcxproj其中 B 具有对 A 的项目引用。

发生的情况是:A project首先开始构建,在编译过程中,B project开始在另一个进程中构建(因为并行构建),并且它将调用构建 A。

现在这会导致竞争条件,因为我们有两个进程试图构建相同的进程project A,并且我会看到访问问题。

理想情况下,如果 A 尚未完成构建,MSBuild 不应调用构建 B,或者如果它调用了 B,则检测到 A 仍在构建并等待其完成。

这一切都没有发生。另外,这种情况仅在 MSBuild 中发生 - 如果我尝试从 VS2015 IDE 构建解决方案文件,则不会发生这种情况。

知道为什么 MSBuild 会这样吗?

com*_*ife 3

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

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

以下 VS 博客实际上陈述了相反的情况 - 例如 - https://blogs.msdn.microsoft.com/vcblog/2010/02/16/project-settings-changes-with-vs2010/指出projectdependency和projectreference是类似的仅使用一个特定的项目参考。

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

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