MSBuild 可以通过为每个处理器创建单独的生成过程来充分利用具有多个处理器或多核处理器的系统。 例如,如果系统有四个处理器,MSBuild 将创建四个生成进程。
MSBuild 可以同时处理多个生成,从而减少整个生成时间。 但是,并行生成可以引入生成过程方式的更改。
本文介绍多个构建同时运行时可能发生的流程更改。
项目到项目的引用
当Microsoft生成引擎在项目的并行生成过程中遇到项目引用(ProjectReference
元素),则仅生成引用一次。 如果两个项目具有相同的项目引用,则不会为每个项目重新生成引用。 相反,生成引擎会向两个具有依赖关系的项目返回相同的项目引用。 MSBuild 还在会话中为同一目标的后续请求提供相同的项目引用。
循环检测
并行生成期间的周期检测行为与 MSBuild 2.0 的行为相同。 其中一个区别在于,较新版本的 MSBuild 可以在不同时间或在生成中报告周期的检测情况。
并行生成期间的错误和异常
在并行生成期间,错误和异常的发生时间可能与非parallel 生成期间不同。 此外,如果一个项目无法构建,其他项目仍将继续构建。
MSBuild 不会停止与失败的生成并行的任何正在生成中的项目。 其他项目将继续生成,直到最后成功或者失败。 ContinueOnError启用设置后,即使发生错误,也不会停止生成。
C++项目(.vcxproj)和解决方案(.sln)文件
可以将C++项目(.vcxproj)和解决方案(.sln)文件传递给 MSBuild 任务。
- C++项目:调用 VCWrapperProject API,然后创建内部 MSBuild 项目。
- C++解决方案:将创建 SolutionWrapperProject 实例,然后创建内部 MSBuild 项目。
在这两种情况下,生成的项目都像处理任何其他 MSBuild 项目一样处理。
多进程执行
几乎所有与生成相关的活动都需要当前目录在整个生成过程中保持一致,以防止与路径相关的错误。 项目无法在 MSBuild 中的不同线程上运行,因为它们可能会导致创建多个目录。
为了避免此问题,但仍启用多处理器生成,MSBuild 使用 进程隔离。 此过程使 MSBuild 能够创建最大 n
进程,其中 n
等于系统上可用的处理器数。 例如,如果 MSBuild 在具有两个处理器的系统上生成解决方案,则只创建两个生成进程。 重复使用这些过程来生成解决方案中的所有项目。