Как запускать задачи параллельно в MSBuild - PullRequest
28 голосов
/ 15 июня 2009

Если я не очень неправильно понял MSBuild, задачи выполняются в том порядке, в котором они появляются в узле 'Target'.

Я бы хотел иметь возможность указать, что две задачи (например, задачи xcopy) могут выполняться параллельно. Я ожидал, что будет параллельное задание или что-то в этом роде ...?

Ответы [ 5 ]

37 голосов
/ 29 февраля 2012

Попробуйте новую параллельную задачу в пакете расширений MSBuild - http://mikefourie.wordpress.com/2012/02/29/executing-msbuild-targets-in-parallel-part-1

16 голосов
/ 17 июня 2009

Как уже говорилось, вы не можете распараллелить на уровне задачи или даже на целевом уровне. Только MSBuild будет строить проекты (т.е. файлы проектов MSBuild) параллельно. Поэтому вы должны использовать задачу MSBuild с указанием нескольких проектов, а для атрибута BuildInParallel должно быть установлено значение true. Также убедитесь, что при сборке из командной строки вызывается ключ / m.

Сайед Ибрагим Хашими

Моя книга: Внутри Microsoft Build Engine: Использование MSBuild и Team Foundation Build

6 голосов
/ 16 июня 2009

MSBuild имеет ключ командной строки /m, чтобы указать максимальное количество одновременных процессов для сборки. Значение по умолчанию: 1. /m:x будет использовать x процессов. /m будет использовать количество процессоров на компьютере.

Я использовал это как часть ярлыка в Visual Studio для более быстрого запуска сборок путем параллельной компиляции проектов. Скотт Хансельман имеет несколько сообщений об этом здесь и здесь .

5 голосов
/ 15 мая 2015

Вот пример способа параллельного запуска целей msbuild. Идея та же ... представить сам файл msbuild как проект для сборки. Я скопировал его из моего собственного вопроса: Оценить элемент, определенный в задаче msbuild, через C #

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build">
<Target Name="Build" DependsOnTargets="PrepareEnvironmentForBuild;MapDrives">
    <Exec Command="$(MSBuildBinPath)\msbuild /nologo /clp:Verbosity=quiet $(MSBuildThisFileFullPath) /t:TargetWithConfidentialSteps"/>
    <ItemGroup>
        <StepsToRunInParallel Include="$(MSBuildThisFileFullPath)">
            <Properties>TargetToInvoke=ParallelTarget1</Properties>
        </StepsToRunInParallel>
        <StepsToRunInParallel Include="$(MSBuildThisFileFullPath)">
            <Properties>TargetToInvoke=ParallelTarget2</Properties>
        </StepsToRunInParallel>
    </ItemGroup>
    <MSBuild Projects="@(StepsToRunInParallel)" BuildInParallel="true" StopOnFirstFailure="true" Targets="InvokeInParallelWithinThisProject"/>

</Target>
<Target Name="InvokeInParallelWithinThisProject">
    <MSBuild Projects="$(MSBuildThisFileFullPath)" Targets="$(TargetToInvoke)" StopOnFirstFailure="true"/>
</Target>
<Target Name="ParallelTarget1">
    <Message Text="Hello from ParallelTarget1"/>
</Target>
<Target Name="ParallelTarget2">
    <Message Text="Hello from ParallelTarget2"/>
</Target>
<Target Name="PrepareEnvironmentForBuild">
    <Message Text="Hello from PrepareEnvironmentForBuild"/>
</Target>
<Target Name="MapDrives">
    <Message Text="Hello from MapDrives"/>
</Target>
<Target Name="TargetWithConfidentialSteps">
    <Message Text="Hush! Verbosity on the wrapper does not affect the Exec call." Importance="High"/>
</Target>

3 голосов
/ 15 июня 2009

Я не думаю, что есть способ сделать это, кроме как использовать какой-либо внешний инструмент. Я подозреваю, что это связано с тем, что это создает потенциальные проблемы с зависимостями, которые MS предпочитает временно игнорировать, что позволяет сторонним поставщикам инструментов решить эту проблему (и заплатить за нее немало денег).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...