web-dev-qa-db-ja.com

MSBuildでタスクを並行して実行する方法

MSBuildをひどく誤解していない限り、タスクは「ターゲット」ノード内に表示されるドキュメントの順序で実行されます。

2つのタスク(xcopyタスクなど)を並行して実行できるように指定できるようにしたいと思います。 「並列」タスクか何かがあると思っていました...?

30
Pete Montgomery

すでに述べたように、タスクレベルまたはターゲットレベルでさえ並列化することはできません。 MSBuildは、プロジェクト(つまり、MSBuildプロジェクトファイル)のみを並行してビルドします。したがって、複数のプロジェクトを指定して MSBuildタスク を使用する必要があり、BuildInParallel属性をtrueに設定する必要があります。また、コマンドラインでビルドが呼び出されたときに、/ mスイッチが送信されることを確認してください。

イブラヒム橋見は言った

私の本: Microsoftビルドエンジンの内部:MSBuildとTeam Foundationビルドの使用

16

MSBuild拡張パックの新しい並列タスクを試してください http://mikefourie.wordpress.com/2012/02/29/executing-msbuild-targets-in-parallel-part-1

37
Mike Fourie

MSBuildには/mコマンドラインスイッチを使用して、ビルドに使用する同時プロセスの最大数を指定します。デフォルト値は1です。/m:xはxプロセスを使用します。 /mコンピューター上のプロセッサーの数を使用します。

これをVisualStudioのショートカットの一部として使用して、プロジェクトを並行してコンパイルすることでビルドをより迅速に実行しました。スコットハンゼルマンはそれについていくつかの投稿をしています ここここ

6
adrianbanks

これは、msbuildターゲットを並行して実行する方法の例です。考え方は同じです...このmsbuildファイル自体をビルドするプロジェクトとして提示します。私は自分の質問からそれをコピーしました: C#を介して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>
6
Parag Doke

外部ツールを使用する以外にこれを行う方法はないと思います。これは、MSが当面無視することを選択した潜在的な依存関係の問題を引き起こし、外部のツールベンダーが問題に取り組むことを可能にするためだと思います(そしてそれにかなりのお金を請求します)。

3
Paul Sonier