次の方法で共有


大規模なプロジェクトのビルドにおけるメモリの効率的な使用

更新 : 2007 年 11 月

大規模なプロジェクトには多数のサブプロジェクトやその他の依存関係が含まれていることが多く、それらがビルド時に大量のシステム メモリを消費することがあります。システム メモリの容量が減少すると、システム パフォーマンスも低下するおそれがあります。MSBuild 3.5 では、この問題を軽減するために、ビルドが完了したプロジェクトをメモリからアンロードします。ただし、ビルド結果はキャッシュに残っているため、アンロード後でも取得できます。

プロジェクトのアンロード、結果のキャッシュ、および結果の取得

MSBuild の以前のバージョンでは、プロジェクトがビルドの完了後もメモリに残っていました。MSBuild 3.5 では、UnloadProjectsOnCompletion というタスク プロパティが追加されたことにより、ビルドが完了したプロジェクトをメモリから削除できるようになりました。

ただし、メモリからアンロードしたプロジェクトを同じビルド インスタンスに再読み込みすることはできません。ビルドにはプロジェクト内の情報を収集するために呼び出す必要のあるターゲットが含まれていることが多いため、ビルドの実行中にプロジェクトをメモリからアンロードすると、問題が発生することがあります。これに対処するため、MSBuild 3.5 には UseResultsCache というプロパティも追加されました。このプロパティを使用することにより、ビルドしているすべてのプロジェクトのターゲット結果 (ビルドの結果、項目、プロパティなど) をキャッシュできます。

プロジェクトの方がそのビルド結果より多くのメモリを占有するため、プロジェクトをアンロードしてビルド結果を残しておく方がメモリの使用の点で効率的です。UnloadProjectsOnCompletion と UseResultsCache の連携により、メモリが解放されるだけでなく、MSBuild がビルド結果をディスク上のファイルではなくメモリから直接取得できるようになるため、ビルドのパフォーマンスが向上します。

UnloadProjectsOnCompletion と UseResultsCache の使用方法を次の例に示します。この例には、MyProj1.proj と MyProj2.proj の 2 つのプロジェクトがあります。

MyProj1.proj

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="default">
        <Message Text="Project: MyProj1. Target: default" />
        <CallTarget Targets="Normal" UseResultsCache="true"/>
    </Target>
    <Target Name="Normal" Outputs="Someoutput from second target">
        <Message Text="Project: MyProj1. Target: second" />
    </Target>
</Project>

MyProj2.proj

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="default">
        <Message Text="Project: MyProj2.proj Target: default" />
        <MSBuild Projects=" MyProj1.proj" Targets="default" 
            UnloadProjectsOnCompletion="true" />
        <MSBuild Projects=" MyProj1.proj" Targets="Normal"
            UnloadProjectsOnCompletion="true" >
            <Output TaskParameter="TargetOutputs" 
                PropertyName="TargetOutput"/>
        </MSBuild>
        <Message Text="Output from project: MyProj2.proj target: second 
            = $(TargetOutput)" />
    </Target>
</Project>

コマンド ラインで msbuild.exe MyProj2.proj /tv:3.5 を使用して MyProj2.proj をビルドすると、MyProj2 から取得された MyProj1 のターゲット Normal の出力が表示されます。

参照

概念

複数のプロジェクトの並行ビルド