MSBuild では、プロセッサごとに個別のビルド プロセスを作成することで、複数のプロセッサまたは複数コア プロセッサを持つシステムを最大限に活用できます。 たとえば、システムに 4 つのプロセッサがある場合、MSBuild は 4 つのビルド プロセスを作成します。
MSBuild では、複数のビルドを同時に処理できるため、全体的なビルド時間が短縮されます。 ただし、並列ビルドでは、ビルド プロセスの発生方法に変更が加わる可能性があります。
この記事では、複数のビルドが同時に実行されるときに発生する可能性があるプロセスの変更について説明します。
プロジェクト間参照
Microsoft ビルド エンジンは、プロジェクトの並列ビルド中にプロジェクト参照 (ProjectReference
要素) を検出すると、参照を 1 回だけビルドします。 2 つのプロジェクトに同じプロジェクト参照がある場合、参照はプロジェクトごとに再構築されません。 代わりに、ビルド エンジンは、依存関係を持つ両方のプロジェクトに同じプロジェクト参照を返します。 また、MSBuild は、同じターゲットに対するセッション内の今後の要求に対して同じプロジェクト参照を提供します。
サイクル検出
並列ビルド中のサイクル検出は、MSBuild 2.0 の場合と同じ動作です。 1 つの違いは、新しいバージョンの MSBuild では、別の時刻またはビルドでサイクルの検出を報告できることです。
並列ビルド中のエラーと例外
並列ビルドでは、エラーと例外は、非パラメーター ビルド時とは異なる時間に発生する可能性があります。 また、1 つのプロジェクトがビルドされない場合は、他のプロジェクトビルドが続行されます。
MSBuild は、失敗したビルドと並行してプロジェクトのビルドを停止しません。 他のプロジェクトは、成功または失敗するまでビルドを続けます。 ContinueOnError設定を有効にすると、エラーが発生してもビルドは停止しません。
C++ プロジェクト (.vcxproj) ファイルとソリューション (.sln) ファイル
C++ プロジェクト (.vcxproj) ファイルとソリューション (.sln) ファイルの両方を MSBuild タスクに渡すことができます。
- C++ プロジェクト: VCWrapperProject API が呼び出され、内部 MSBuild プロジェクトが作成されます。
- C++ ソリューション: SolutionWrapperProject インスタンスが作成され、内部 MSBuild プロジェクトが作成されます。
どちらの場合も、結果のプロジェクトは他の MSBuild プロジェクトと同様に処理されます。
マルチプロセス実行
ほとんどのビルド関連アクティビティでは、パス関連のエラーを防ぐために、ビルド プロセス全体で現在のディレクトリを一定に保つ必要があります。 プロジェクトは複数のディレクトリの作成を引き起こす可能性があるため、MSBuild の異なるスレッドで実行できません。
この問題を回避してもマルチプロセッサ ビルドを有効にするために、MSBuild では プロセス分離が使用されます。 このプロセスにより、MSBuild は最大 n
プロセスを作成でき、 n
はシステムで使用可能なプロセッサの数と等しくなります。 たとえば、MSBuild が 2 つのプロセッサを持つシステム上にソリューションをビルドする場合、作成されるビルド プロセスは 2 つだけです。 これらのプロセスは、ソリューション内のすべてのプロジェクトをビルドするために再利用されます。
関連コンテンツ
- 複数のプロジェクトを並列 でビルドする
- MSBuild タスク