MSBuild ターゲット
更新 : 2007 年 11 月
ターゲットはタスクを特定の順序でグループ化し、コマンド ラインからビルド プロセスのセクションを呼び出すことができるようにします。プロジェクト ファイルの拡張性や読みやすさを高める目的で、複数のターゲットを論理的なセクションとしてグループ化することもできます。たとえば、1 つのターゲットで出力ディレクトリ内のすべてのファイルを削除してビルドの準備を行い、別のターゲットでプロジェクトの入力をコンパイルして空のディレクトリに配置できます。
プロジェクト ファイルでのターゲットの宣言
ターゲットは、プロジェクト ファイル内で、Target 要素を使って宣言します。たとえば、次の XML では、Compile 項目のコレクションをパラメータに指定して、Csc タスクを呼び出す、Compile という名前のターゲットを作成しています。
<Target Name="Compile>
<Csc Sources="@(Compile)" />
</Target>
ターゲットは、Condition 属性も使用できます。指定した条件が false と評価されると、ターゲットは実行されません。また、MSBuild エンジンも DependsOnTargets 属性で指定したターゲットを実行しません。条件の詳細については、「MSBuild の条件」を参照してください。
依存関係の分析
ターゲットで相互の関係を定義し、依存関係の分析を実行するなど、より高度なシナリオにも対応しています。これにより、ターゲットが最新のものである場合に、ビルド プロセスからセクション全体をスキップするようなことが可能となります。DependsOnTargets 属性を使用すると、特定のターゲットよりも先に実行する必要のあるターゲットを宣言できます。MSBuild エンジンは、ターゲットを実行する際に、最初に、この属性に一覧表示されているターゲットを自動的に実行します。詳細については、「方法 : インクリメンタル ビルドを実行する」を参照してください。
![]() |
---|
ターゲットは、単一のビルドで 2 回実行されることはありません。いったん実行されたターゲットは、その作業が完了したものと見なされ、たとえビルド内の後続のターゲットがこのターゲットに依存している場合でも、再度実行されることはありません。 |
最適な使用方法
この方法でプロジェクト ファイルを分割すると、ファイル内の他のセクションに影響を与えずに、特定のセクションを変更できます。たとえば、リソースを使用してプロジェクトをビルドする方法の 1 つとして、GenerateResource および Csc タスクを次のように同じターゲット内に配置します。
<Target Name="Build">
<GenerateResource
Sources="alpha.resx; beta.txt"
<Output
TaskParameter="OutputResources"
ItemName="Resources"/>
</GenerateResource>
<Csc
Sources="hello.cs"
Resources="@(Resources)"
OutputAssembly="hello.exe"/>
</Target>
この方法を使用すると、プロジェクトは必要に応じてビルドしますが、ターゲットは大規模で柔軟性の低いものになります。後から他のタスクを追加して GenerateResource と Csc の間で実行する場合、それらをすべて 1 つのターゲットに含めると、プロジェクト ファイルを読み込むのが非常に困難になります。さらに、そのような多数のタスクを含む大規模なターゲットを作成すると、前にビルドしていないターゲットや古いターゲットのみを再ビルドするインクリメンタル ビルドを、効率的に実行できません。また、ターゲットのサイズが大きいと、ターゲットを実行して特定のタスクを実行できません。前の例では、コンパイルせずにリソースを生成する方法はありません。
プロジェクト ファイルを作成するには、複数のターゲットを使用し、それらの依存関係を明示的に表すのがより良い方法です。この方法を使用すると、任意のターゲットを個別に実行して、ビルドするたびに 1 つのターゲット内のタスクの長い一覧を実行する代わりに、タスクのより小さいセットを実行することもできます。この例では、各タスクは個別のターゲットであり、DependsOnTargets 属性は Resources ターゲットを実行してから Build ターゲットを実行する必要があることを指定します。
<Target Name="Resources">
<GenerateResource
Sources="alpha.resx; beta.txt"
<Output
TaskParameter="OutputResources"
ItemName="Resources"/>
</GenerateResource>
</Target>
<Target Name="Build" DependsOnTargets="Resources">
<Csc
Sources="hello.cs"
Resources="@(Resources)"
OutputAssembly="hello.exe"/>
</Target>
参照
処理手順
方法 : 複数のプロジェクト ファイルで同じターゲットを使用する