通过参数向 MSBuild 提供多个构建配置并让它们并行构建
Provide multiple build configurations to MSBuild through arguments and have them build in parallel
我正在尝试设置一个 MSBuild .proj 文件,该文件可以将多个构建配置作为参数传入,然后并行构建这些配置。这是我想要做的一个例子:
msbuild MultiConfigBuild.proj /m:8 /ds /property:Config=Debug+Release;Platform=x64
我已经构建了多个配置,但我无法让它们并行构建,即使使用 BuildInParallel="true"
和 /m:8
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Rebuild" ToolsVersion="4.0">
<ItemGroup>
<ConfigList Condition=" '@(ConfigList)' == '' and $(Config) != '' " Include="$(Config.Split('+'))" /><!-- parse all requested configurations into a list -->
<ConfigList Condition=" '@(ConfigList)' == '' " Include="Debug" /><!-- if no configurations were specified, default to Debug -->
</ItemGroup>
<!--
Build the project for each requested configuration. -->
<Target Name="Rebuild">
<MSBuild Projects="$(MSBuildProjectDirectory)\Application.sln" Targets="Rebuild" Properties="Configuration=%(ConfigList.Identity);Platform=x64" BuildInParallel="true" />
</Target>
</Project>
使用上面的 proj 文件和命令行参数,我得到了节点利用率的输出:
============================== Node Utilization (IDs represent configurations) ====================================================
Timestamp: 1 Duration Cumulative
-----------------------------------------------------------------------------------------------------------------------------------
636942946549229765: 0 0.201s 0.201s ####
636942946551243522: 1 0.006s 0.207s
636942946551303033: 2 0.354s 0.561s #######
636942946554839510: | 0.674s 1.235s #############
636942946561575184: | 0.048s 1.282s
636942946562051339: | 3.362s 4.645s ###################################################################
636942946595675132: | 0.508s 5.152s ##########
636942946600754168: 1 0.001s 5.153s
636942946600764083: 0 0.007s 5.160s
636942946600833525: 3 0.002s 5.163s
636942946600858339: 4 0.136s 5.299s ##
636942946602217371: | 0.420s 5.719s ########
636942946606418477: | 0.023s 5.742s
636942946606651600: | 2.443s 8.185s ################################################
636942946631079558: | 1.692s 9.877s #################################
636942946648003047: 0 0.000s 9.878s
-----------------------------------------------------------------------------------------------------------------------------------
Utilization: 100.0 Average Utilization: 100.0
它正在同一节点上连续构建 2 个配置。
我已经尝试了 this question 中给出的解决方案,它确实并行构建了配置,但我无法将其设置为解析作为参数传入的多个配置。
当您使用 %(Item.Metadata)
语法时,您使用的是项目批处理,它会创建按顺序执行的类似元数据批次。所以 MSBuild 任务被调用了 2 次。
相反,您想将多个项目传递给一个具有不同配置的 MSBuild 任务。您可以通过使用批处理创建一个包含项目 (/解决方案) 文件的项目来完成此操作,以使用 MSBuild 任务用于设置属性 (AdditionalProperties
) 的附加元数据进行构建,然后将这些项目项目集传递给单个 MSBuild 任务:
<Target Name="Rebuild">
<ItemGroup>
<ProjectToBuild Include="$(MSBuildProjectDirectory)\Application.sln">
<AdditionalProperties>Configuration=%(ConfigList.Identity)</AdditionalProperties>
</ProjectToBuild>
</ItemGroup>
<MSBuild Projects="@(ProjectToBuild)" Targets="Rebuild" Properties="Platform=x64" BuildInParallel="true" />
</Target>
我正在尝试设置一个 MSBuild .proj 文件,该文件可以将多个构建配置作为参数传入,然后并行构建这些配置。这是我想要做的一个例子:
msbuild MultiConfigBuild.proj /m:8 /ds /property:Config=Debug+Release;Platform=x64
我已经构建了多个配置,但我无法让它们并行构建,即使使用 BuildInParallel="true"
和 /m:8
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Rebuild" ToolsVersion="4.0">
<ItemGroup>
<ConfigList Condition=" '@(ConfigList)' == '' and $(Config) != '' " Include="$(Config.Split('+'))" /><!-- parse all requested configurations into a list -->
<ConfigList Condition=" '@(ConfigList)' == '' " Include="Debug" /><!-- if no configurations were specified, default to Debug -->
</ItemGroup>
<!--
Build the project for each requested configuration. -->
<Target Name="Rebuild">
<MSBuild Projects="$(MSBuildProjectDirectory)\Application.sln" Targets="Rebuild" Properties="Configuration=%(ConfigList.Identity);Platform=x64" BuildInParallel="true" />
</Target>
</Project>
使用上面的 proj 文件和命令行参数,我得到了节点利用率的输出:
============================== Node Utilization (IDs represent configurations) ====================================================
Timestamp: 1 Duration Cumulative
-----------------------------------------------------------------------------------------------------------------------------------
636942946549229765: 0 0.201s 0.201s ####
636942946551243522: 1 0.006s 0.207s
636942946551303033: 2 0.354s 0.561s #######
636942946554839510: | 0.674s 1.235s #############
636942946561575184: | 0.048s 1.282s
636942946562051339: | 3.362s 4.645s ###################################################################
636942946595675132: | 0.508s 5.152s ##########
636942946600754168: 1 0.001s 5.153s
636942946600764083: 0 0.007s 5.160s
636942946600833525: 3 0.002s 5.163s
636942946600858339: 4 0.136s 5.299s ##
636942946602217371: | 0.420s 5.719s ########
636942946606418477: | 0.023s 5.742s
636942946606651600: | 2.443s 8.185s ################################################
636942946631079558: | 1.692s 9.877s #################################
636942946648003047: 0 0.000s 9.878s
-----------------------------------------------------------------------------------------------------------------------------------
Utilization: 100.0 Average Utilization: 100.0
它正在同一节点上连续构建 2 个配置。
我已经尝试了 this question 中给出的解决方案,它确实并行构建了配置,但我无法将其设置为解析作为参数传入的多个配置。
当您使用 %(Item.Metadata)
语法时,您使用的是项目批处理,它会创建按顺序执行的类似元数据批次。所以 MSBuild 任务被调用了 2 次。
相反,您想将多个项目传递给一个具有不同配置的 MSBuild 任务。您可以通过使用批处理创建一个包含项目 (/解决方案) 文件的项目来完成此操作,以使用 MSBuild 任务用于设置属性 (AdditionalProperties
) 的附加元数据进行构建,然后将这些项目项目集传递给单个 MSBuild 任务:
<Target Name="Rebuild">
<ItemGroup>
<ProjectToBuild Include="$(MSBuildProjectDirectory)\Application.sln">
<AdditionalProperties>Configuration=%(ConfigList.Identity)</AdditionalProperties>
</ProjectToBuild>
</ItemGroup>
<MSBuild Projects="@(ProjectToBuild)" Targets="Rebuild" Properties="Platform=x64" BuildInParallel="true" />
</Target>