ターゲットのビルド順序

あるターゲットへの入力が別のターゲットの出力に依存する場合、ターゲットの順序を指定する必要があります。 以下の属性を使用して、ターゲットを実行する順序を指定できます。

  • InitialTargets。 この Project 属性は、ターゲットがコマンド ラインまたは DefaultTargets 属性に指定されている場合でも最初に実行されるターゲットを指定します。

  • DefaultTargets. この Project 属性は、コマンド ラインでターゲットが明示的に指定されていない場合に実行されるターゲットを指定します。

  • DependsOnTargets. この Target 属性は、このターゲットを実行する前に実行する必要があるターゲットを指定します。

  • BeforeTargets および AfterTargets。 これらの Target 属性は、このターゲットを、指定されたターゲットの前または後に実行するように指定します。

ビルド内の後続のターゲットがそのターゲットに依存している場合でも、ビルド中に 1 つのターゲットが 2 回実行されることはありません。 ターゲットは一度実行されると、それ以上ビルドに影響しません。

ターゲットは、 Condition 属性を持つことができます。 指定した条件が false と評価された場合、ターゲットは実行されず、ビルドには影響しません。 条件の詳細については、「条件」を参照してください。

初期ターゲット

Project 要素の InitialTargets 属性は、ターゲットがコマンド ラインまたは DefaultTargets 属性に指定されている場合でも最初に実行されるターゲットを指定します。 通常、初期ターゲットはエラー チェックに使用されます。

InitialTargets 属性の値は、ターゲットをセミコロンで区切った、順序指定された一覧です。 次の例では、Warm ターゲットを実行してから Eject ターゲットを実行するように指定しています。

<Project InitialTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

インポートされたプロジェクトは、独自 InitialTargets の属性を持つことができます。 それらのすべての初期ターゲットが集約されて順番に実行されます。

詳細については、「方法: 最初にビルドするターゲットを指定する」を参照してください。

既定のターゲット

Project 要素の DefaultTargets 属性は、ターゲットがコマンド ラインで明示的に指定されていない場合にビルドするターゲット (複数可) を指定します。

DefaultTargets 属性の値は、既定のターゲットをセミコロンで区切った、順序指定された一覧です。 次の例では、Clean ターゲットを実行してから Build ターゲットを実行するように指定しています。

<Project DefaultTargets="Clean;Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

コマンド ラインで -target スイッチを使用して、既定のターゲットをオーバーライドすることができます。 次の例では、Build ターゲットを実行してから Report ターゲットを実行するように指定しています。 この方法でターゲットを指定する場合、既定のターゲットは無視されます。

msbuild -target:Build;Report

初期ターゲットと既定のターゲットの両方が指定されており、コマンド ライン ターゲットが指定されていない場合、MSBuild はまず初期ターゲットを実行してから、既定のターゲットを実行します。

インポートされたプロジェクトは、独自の DefaultTargets 属性を持つことができます。 検出された最初の DefaultTargets 属性によって、実行する既定のターゲットが決定されます。

詳細については、「方法: 最初にビルドするターゲットを指定する」を参照してください。

最初のターゲット

初期ターゲット、既定のターゲット、またはコマンド ラインのターゲットがいずれも指定されていない場合、MSBuild はプロジェクト ファイル内またはインポートされたプロジェクト ファイル内で検出された最初のターゲットを実行します。

ターゲットの依存関係

ターゲット同士は相互に依存関係を記述できます。 DependsOnTargets 属性は、ターゲットが他のターゲットに依存していることを示します。 たとえば、次のように入力します。

<Target Name="Serve" DependsOnTargets="Chop;Cook" />

Serve ターゲットが Chop ターゲットと Cook ターゲットに依存することを MSBuild に指示します。 MSBuild は Chop ターゲット、Cook ターゲットの順に実行してから、Serve ターゲットを実行します。

BeforeTargets と AfterTargets

BeforeTargets 属性と AfterTargets 属性を使用して、ターゲットの順序を指定できます。

次のスクリプトがあるとします。

<Project DefaultTargets="Compile;Link" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Compile">
        <Message Text="Compiling" />
    </Target>
    <Target Name="Link">
        <Message Text="Linking" />
    </Target>
</Project>

Compile ターゲットの後、Link ターゲットの前に実行される中間ターゲット Optimize を作成するには、Project 要素内の任意の場所に次のターゲットを追加します。

<Target Name="Optimize" AfterTargets="Compile">
    <Message Text="Optimizing" />
</Target>

または、次のように順序を指定します

<Target Name="Optimize" BeforeTargets="Link">
    <Message Text="Optimizing" />
</Target>

同じターゲットに BeforeTargetsAfterTargets両方を指定することは役に立ちません。 次のセクションで説明するように、最初に検出されたターゲットによってのみ、新しいターゲットが実行されます。

ターゲットのビルド順序の決定

MSBuild では、ターゲットのビルド順序を次のように決定します。

  1. InitialTargets ターゲットが実行されます。

  2. -target スイッチによってコマンドラインで指定されたターゲットが実行されます。 コマンド ラインでターゲットが指定されていない場合、DefaultTargets ターゲットが実行されます。 どちらも存在しない場合は、検出された最初のターゲットが実行されます。

  3. ターゲットの Condition 属性が評価されます。 Condition 属性が存在し、false と評価された場合、ターゲットは実行されず、ビルドにはそれ以上影響しません。

    BeforeTargets または AfterTargets の条件付きターゲットをリストしている他のターゲットは、やはり決められた順序で実行します。

  4. Condition 属性がターゲットに適用されており、評価の結果、false にならない限り、ターゲットが実行されるか、スキップされる前に、その DependsOnTargets ターゲットが実行されます。

    Note

    ターゲットは、出力項目が最新であるために実行されない場合はスキップされたと見なされます (増分ビルドを参照)。 このチェックはターゲット内のタスクが実行される直前に行われ、ターゲットの実行順序には影響を与えません。

  5. ターゲットが実行されるか、スキップされる前に、BeforeTargets 属性でターゲットをリストする他のターゲットが実行されます。

  6. ターゲットが実行される前に、その Inputs 属性と Outputs 属性が比較されます。 対応する入力ファイルに対して最新ではない出力ファイルがあると MSBuild が判断した場合、MSBuild はターゲットを実行します。 それ以外の場合は、MSBuild はターゲットをスキップします。

  7. ターゲットが実行されるか、スキップされると、AfterTargets 属性でそれをリストする他のターゲットが実行されます。