msbuild.exe 命令行带有 /p:BuildInParallel=true 和 /m 参数 - 不同组合之间有什么区别?

mar*_*ark 8 msbuild concurrency

阅读https://www.hanselman.com/blog/FasterBuildsWithMSBuildUsingParallelBuildsAndMulticoreCPUs.aspx后发布此内容。要么这就像泥巴一样清晰,要么我就是纯粹的愚蠢。

我总是在命令行上运行 msbuild.exe,但/m不带任何节点/p:BuildInParallel=true,它总是生成预期数量的 msbuild 节点(我的台式机上有 12 个,我的笔记本电脑上有 4 个),并构建了相应并发程度(12 或 4)的解决方案项目大部分时间都在某个时间)。

另一方面,当我MSBuild从目标文件中调用任务并将其传递给多个项目(或解决方案文件)时,我始终设置BuildInParallelMSBuild 任务的属性。因为这就是使用 MSBuild 任务并行构建项目的方式,对吗?

请注意,这是任务的属性,而不是传入的MSBuild构建属性(如) 。ConfigurationMSBuild.Properties

这篇文章表明实际上有一个同名的构建属性 -BuildInParallel并且它补充了这个/m开关,这对我来说是完全新闻。我搜索了 * c:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild*下的所有 *.targets 文件,唯一提到它的是在以下上下文中:

  1. 如果属性值为nil,则将其设置为true
  2. 将其值传递给MSBuild.BuildInParallel属性。
  3. 构建 Silverlight 项目时的硬编码过程false。(我们仍然有这些,我可以同意 - 它们总是按顺序构建的:-()

我的结论 - 这篇文章在传递到 msbuild.exe 方面具有误导性BuildInParallel,因为它没有任何意义,除非我们传递false到那里。这也不需要,只是不通过/m

但我总是有可能在这里遗漏一些东西,所以我的问题是——如果没有 ,我会失去msbuild.exe /m什么/p:BuildInParallel=true

(我想我知道答案——绝对不知道,但以防万一)

riQ*_*iQQ 1

跑步时我会失去msbuild.exe /m什么/p:BuildInParallel=true

通常情况下,你不会失去任何东西。/p:BuildInParallel=true如果您按照本文的建议手动调整 MSBuild 项目文件,则运行 with仅会更改行为。

基本上,本文建议定义一个名为 的新全局属性,BuildInParallel并将其传递给选定的MSBuild任务,以便能够控制其内置BuildInParallel属性。但是全局属性可以被称为任何其他名称,因为没有预定义的全局属性,即没有内置支持自动获取某个全局属性的值。唯一内置的是任务BuildInParallel的属性MSBuild(大多数/所有其他任务没有此属性)。

BuildInParallel允许MSBuild任务以并行方式处理传递给它的项目列表,而 /m 告诉 MSBuild 允许启动多少个进程。

更细粒度(如果需要)

如果您要自定义 MSBuild 文件,则可以通过添加以下内容来仅关闭某些 MSBuild 任务的并行性:

BuildInParallel=$(BuildInParallel)

到特定的 MSBuild 任务,然后如果您从命令行传入属性,则这些子项目将不会并行构建:

MSBuild /m:4 /p:BuildInParallel=false

但就我而言,这是一个极端情况。

下面是一个示例 MSBuild 项目文件,用于说明并行构建一些项目(如果/m在命令行上传递)、并行构建一些项目(如果/m/p:BuildInParallel=true在命令行上传递)以及始终构建一些项目的用例依次。

<!-- built in parallel if both /m and /p:BuildInParallel=true are specified -->
<MSBuild
    Projects="Solution_with_projects_to_build_in_parallel_1.sln"
    Targets="Build"
    BuildInParallel="$(BuildInParallel)">
</MSBuild>
<!-- built in parallel if /m is specified -->
<MSBuild
    Projects="Solution_with_projects_to_build_in_parallel_2.sln"
    Targets="Build">
</MSBuild>
<MSBuild
    Projects="Solution_with_projects_always_built_sequentially.sln"
    Targets="Build"
    BuildInParallel="false">
</MSBuild>
Run Code Online (Sandbox Code Playgroud)