Предоставьте MSBuild несколько конфигураций сборки с помощью аргументов и сделайте так, чтобы они собирались параллельно - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь настроить файл 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 конфигурации последовательно на одномузел.

Я пробовал решение, данное в в этом вопросе , и оно строит конфигурации параллельно, но я не смог настроить его для анализа нескольких конфигов, переданных в качестве аргументов.

1 Ответ

0 голосов
/ 24 мая 2019

Когда вы используете синтаксис %(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>
...