ターゲットのビルド順序
あるターゲットへの入力が別のターゲットの出力に依存する場合、ターゲットの順序を指定する必要があります。 以下の属性を使用して、ターゲットを実行する順序を指定できます。
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
ターゲットを実行します。
Note
SDK の標準ターゲットは、そのターゲットと依存関係にあるターゲットのリストを持つ多数の DependsOn
プロパティを定義します (例: $(BuildDependsOn)
、$(CleanDependsOn)
など)。 たとえば、 にします。
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">
プロジェクトをカスタマイズするには、「Visual Studio ビルド プロセスの拡張」で説明したように、ビルド プロセスを拡張する追加のカスタム ターゲットで DependsOn
プロパティをオーバーライドできます。
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>
同じターゲットに対して BeforeTargets
と AfterTargets
の 両方 を指定することは有用なことではありません。 次のセクションで説明するように、最初に検出されたターゲットによってのみ、新しいターゲットが実行されます。
ターゲットのビルド順序の決定
MSBuild では、ターゲットのビルド順序を次のように決定します。
InitialTargets
ターゲットが実行されます。-target スイッチによってコマンドラインで指定されたターゲットが実行されます。 コマンド ラインでターゲットが指定されていない場合、
DefaultTargets
ターゲットが実行されます。 どちらも存在しない場合は、検出された最初のターゲットが実行されます。ターゲットの
Condition
属性が評価されます。Condition
属性が存在し、false
と評価された場合、ターゲットは実行されず、ビルドにはそれ以上影響しません。BeforeTargets
またはAfterTargets
の条件付きターゲットをリストしている他のターゲットは、やはり決められた順序で実行します。Condition
属性がターゲットに適用されており、評価の結果、false
にならない限り、ターゲットが実行されるか、スキップされる前に、そのDependsOnTargets
ターゲットが実行されます。Note
ターゲットは、出力項目が最新であるために実行されない場合はスキップされたと見なされます (増分ビルドを参照)。 このチェックはターゲット内のタスクが実行される直前に行われ、ターゲットの実行順序には影響を与えません。
ターゲットが実行されるか、スキップされる前に、
BeforeTargets
属性でターゲットをリストする他のターゲットが実行されます。ターゲットが実行される前に、その
Inputs
属性とOutputs
属性が比較されます。 対応する入力ファイルに対して最新ではない出力ファイルがあると MSBuild が判断した場合、MSBuild はターゲットを実行します。 それ以外の場合は、MSBuild はターゲットをスキップします。ターゲットが実行されるか、スキップされると、
AfterTargets
属性でそれをリストする他のターゲットが実行されます。