MSBuild で複数のプロジェクトを並行ビルドする
MSBuild では、複数のプロジェクトを並列に実行することによって、これらのプロジェクトをより速くビルドすることができます。 ビルドを並列で実行するには、マルチコア コンピューターまたはマルチプロセッサ コンピューターで次の設定を使用します。
-maxcpucount
スイッチをコマンド プロンプトで使用します。BuildInParallel タスク パラメーターを MSBuild タスクで使用します。
Note
コマンド ラインで -verbosity (-v) スイッチを使うと、ビルドのパフォーマンスが影響を受ける場合があります。 ビルド ログ情報の詳細レベルが、トラブルシューティングで使用するために "詳細" または "診断" に設定されている場合、ビルドのパフォーマンスが低下する可能性があります。 詳しくは、「ビルド ログの取得」と「コマンド ライン リファレンス」をご覧ください。
-maxcpucount スイッチ
-maxcpucount
スイッチ (省略形は -m
) を使用すると、MSBuild では、並列実行される可能性がある MSBuild.exe プロセスを指定された数だけ作成できます。 これらのプロセスは、"ワーカー プロセス" とも呼ばれます。各ワーカー プロセスがそれぞれ別のコアまたはプロセッサを使用してプロジェクトをビルドするため、プロセッサごとに異なるプロジェクトを同時にビルドできます。 たとえば、このスイッチを "4" に設定すると、MSBuild では 4 つのワーカー プロセスを作成してプロジェクトをビルドします。
値を指定せずに -maxcpucount
スイッチを追加すると、MSBuild では、コンピューター上のプロセッサの数まで使用します。
MSBuild 3.5 で導入されたこのスイッチについて詳しくは、「コマンド ライン リファレンス」をご覧ください。
次の例は、MSBuild で 3 つのワーカー プロセスを使用する方法を示しています。 この構成を使用すると、MSBuild では同時に 3 つのプロジェクトをビルドできます。
msbuild.exe myproj.proj -maxcpucount:3
BuildInParallel タスク パラメーター
BuildInParallel
は、MSBuild タスクに対する省略可能なブール値パラメーターです。 BuildInParallel
を true
(既定値は true
) に設定すると、複数のワーカー プロセスが生成され、それと同じ数のプロジェクトを同時にビルドすることができます。 これを正しく機能させるには、-maxcpucount
スイッチを 1 より大きい値に設定する必要があります。
並列ビルドは MSBuild タスクの 1 回の呼び出しに対してのみ機能するため、タスクのバッチ処理を呼び出す場合、並列処理は各バッチに制限されます。 「MSBuild バッチを参照してください。」
次の例は、BuildInParallel
パラメーターを使用して、複数の異なるプロパティ値を並列で持つプロジェクト ファイル内にターゲットをビルドする方法を示しています。
SourceValue
ごとに異なるメッセージを出力するターゲットを含むプロジェクト ファイル do_it.proj
を次に示します。
<Project>
<Target Name="DoIt">
<Message Text="For this invocation SourceValue='$(SourceValue)'" Importance="High" />
</Target>
</Project>
次のプロジェクトでは、項目リストと AdditionalProperties
メタデータを使用してプロパティ SourceValue
のさまざまな値を指定して、指定されたターゲット DoIt
を do_it.proj
で並列にビルドします。
<Project>
<ItemGroup>
<_Project Include="do_it.proj" AdditionalProperties="SourceValue=Test1" />
<_Project Include="do_it.proj" AdditionalProperties="SourceValue=Test2" />
<_Project Include="do_it.proj" AdditionalProperties="SourceValue=Test3" />
<_Project Include="do_it.proj" AdditionalProperties="SourceValue=Test4" />
</ItemGroup>
<Target Name="Build">
<MSBuild Projects="@(_Project)" Targets="DoIt" BuildInParallel="true" />
</Target>
</Project>