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

8
阅读完https://www.hanselman.com/blog/FasterBuildsWithMSBuildUsingParallelBuildsAndMulticoreCPUs.aspx后,我发现问题要么非常难懂,要么就是我太蠢了。
我一直通过命令行运行msbuild.exe /m,而没有使用/p:BuildInParallel=true,这样它总是会生成预期数量的msbuild节点(我的桌面电脑上有12个,笔记本电脑上有4个),并在大多数情况下按照相应的并发度(每次12或4个)构建解决方案项目。
另一方面,当我从目标文件中调用MSBuild任务,并传递多个项目(或一个解决方案文件)时,我总是设置了MSBuild任务的BuildInParallel属性。因为这就是使用MSBuild任务并行构建项目的方法,对吧?
请注意,这是MSBuild任务的属性,不是通过MSBuild.Properties传递的构建属性(例如Configuration)。
该文章指出,实际上存在一个同名的构建属性-BuildInParallel,它与/m开关相辅相成,这对我来说是个完全的新闻。我在*c:\Program Files(x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild*下搜索了所有*.targets文件,唯一提到它的地方是在以下上下文中:
  1. 如果属性值为nil,请将其设置为true
  2. 将其值传递给MSBuild.BuildInParallel属性。
  3. 构建Silverlight项目时硬编码传递false。(我们仍然有这些项目,我可以证实-它们总是按顺序构建:-()
我的结论是,该文章误导了我们要将BuildInParallel传递给msbuild.exe,因为除非我们传递false,否则它没有任何意义。这也不需要,只需不传递/m即可。
但是,我可能会错过些什么,所以我的问题是-如果在没有/p:BuildInParallel=true的情况下运行msbuild.exe /m,我会失去什么呢?
(我认为我知道答案-绝对没有任何东西,但以防万一)
1个回答

1
在没有使用/p:BuildInParallel=true的情况下运行msbuild.exe /m通常不会有任何损失。只有在手动调整了MSBuild项目文件并按照文章中所提出的建议定义了一个名为BuildInParallel的新全局属性并将其传递给选定的MSBuild任务以控制其内置的BuildInParallel属性时,才会改变行为。但是全局属性可以被称为任何其他名称,因为没有预定义的全局属性,即没有自动选择特定全局属性值的内置支持。唯一内置的是MSBuild任务的BuildInParallel属性(大多数/所有其他任务都没有此属性)。 BuildInParallel允许MSBuild任务以并行方式处理传递给它的项目列表,而/m告诉MSBuild允许启动多少进程。
如果您正在自定义MSBuild文件,则可以通过添加以下内容仅关闭某些MSBuild任务上的并行处理: BuildInParallel=$(BuildInParallel) 然后,如果从命令行传递了属性,则只有那些子项目不会并行构建: 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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接