Параллельное выполнение нескольких задач exec

Я объединяю несколько задач exec в процессе сборки. Каждое выполнение занимает около одной минуты, поэтому я хотел бы запускать их параллельно, чтобы повысить общую производительность сборки.

Цель, которая запускает несколько exec задач:

<Target Name="CreatePackages" DependsOnTargets="Build" AfterTargets="Build">
  <Exec Command="SomeExecutable.exe %(SomeGroup.Location) </Exec>
</Target>

Определение ItemGroup:

<ItemGroup>
  <SomeGroup Include="Production">
    <Location>SomePath/Production</Location>
  </SomeGroup>
  <SomeGroup Include="Test">
    <Location>SomePath/Test</Location>
  </SomeGroup>
  <SomeGroup Include="Development">
    <Location>SomePath/Development</Location>
  </SomeGroup>
</ItemGroup>

Как запустить эти exec задач параллельно?


person Dave New    schedule 20.06.2014    source источник


Ответы (1)


MSBuild не выполняет распараллеливание на уровне задачи или цели, а только на уровне проекта. У вас есть выбор: обернуть каждое отдельное местоположение в цель и вызвать сам проект параллельно (беспорядочно), или написать пользовательскую задачу с TPL (System.Threading.Tasks.Parallel) и Microsoft.Build.Tasks.Exec или System.Diagnostics.Process (просто), или попробовать YieldDuringToolExecution (технически не распараллеливание, но другие задачи будут ждать меньше).

person Ilya Kozhevnikov    schedule 20.06.2014
comment
@davenewza Вроде как, посмотрите на скриншот, на нем есть 3 сводки по сборке. Я думаю, будет точнее сказать, что он построил проект трижды параллельно с одной целью на каждую, а не построил проект с тремя параллельными целями, и это именно то, что я имел в виду под первым вариантом, хотя я бы рекомендовал вам сделайте второй с TPL и пользовательской задачей. - person Ilya Kozhevnikov; 20.06.2014
comment
@davenewza, технически MSBuild распараллеливает только только на уровне проекта. Хитрость пакета расширений заключается в том, что он запускает несколько экземпляров MSBuild.exe параллельно, что эквивалентно вызову msbuild MyProject.proj /t:OneOfMyTargets. Это может выглядеть похоже на распараллеливание, поддерживаемое MSBuild, но это не так. Причина в том, что любые предварительные условия ваших целей будут выполняться несколько раз, тем самым нарушая модель MSBuild. MSBuild (на уровне проекта) гарантирует выполнение любой цели не более одного раза. Я бы не рекомендовал использовать эту функциональность из пакета расширения. - person seva titov; 20.06.2014