Подтвердить что ты не робот

Как запускать задачи параллельно в MSBuild

Если я грубо неправильно понял MSBuild, задачи выполняются в порядке документа, в котором они отображаются в "Целевом" node.

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

4b9b3361

Ответ 1

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

Сказал Ибрагим Хашими

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

<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>