4

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

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

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

知道为什么 MSBuild 会这样吗?

4

1 回答 1

2

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

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

以下 VS 博客实际上说明了相反的情况 - 例如 - https://blogs.msdn.microsoft.com/vcblog/2010/02/16/project-settings-changes-with-vs2010/声明 projectdependencies 和 projectreference 是类似的并且只使用一个专门的项目参考。

这在您使用 VS IDE 构建时可能是正确的,但对于 MSBuild 则不是。它需要在ProjectReferenceProjectDependencies上定义项目依赖项。

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

于 2017-06-26T22:56:42.147 回答