私はこれら2つを区別できません。助けてください!
前に実行する必要がありますターゲットを実行できるターゲットを定義します。
<Target Name="DependsOn" DependsOnTargets="DependencyTarget1;DependencyTarget2">
<Message Text="Target : DependsOn"/>
</Target>
<Target Name="DependencyTarget2">
<Message Text="Target : DependencyTarget2"/>
</Target>
<Target Name="DependencyTarget1">
<Message Text="Target : DependencyTarget1"/>
</Target>
Output
> Target : DependencyTarget1
> Target : DependencyTarget2
> Target : DependsOn
ターゲットが指定された1つ以上のターゲットの前または後にrunであることを示します。
<Target Name="BeforeAndAfter">
<Message Text="Target : BeforeAndAfter"/>
</Target>
<!-- BeforeTarget1 will run BEFORE target "BeforeAndAfter" -->
<Target Name="BeforeTarget" BeforeTargets="BeforeAndAfter">
<Message Text="BeforeTarget run before : BeforeAndAfter"/>
</Target>
<!-- BeforeTarget1 will run AFTER target "BeforeAndAfter" -->
<Target Name="AfterTarget" AfterTargets="BeforeAndAfter">
<Message Text="AfterTarget run after : BeforeAndAfter"/>
</Target>
Output
> BeforeTarget run before : BeforeAndAfter
> Target : BeforeAndAfter
> AfterTarget run after : BeforeAndAfter
同じ指定されたターゲットの前または後に実行する必要がある複数のターゲットがある場合、それらは宣言順に実行されます:
<Target Name="BeforeAndAfter">
<Message Text="Target : BeforeAndAfter"/>
</Target>
<!--
BOTH BeforeTarget1 and BeforeTarget2 should run before target "BeforeAndAfter"
-->
<Target Name="BeforeTarget1" BeforeTargets="BeforeAndAfter">
<Message Text="BeforeTarget1 run before : BeforeAndAfter"/>
</Target>
<Target Name="BeforeTarget2" BeforeTargets="BeforeAndAfter">
<Message Text="BeforeTarget2 run before : BeforeAndAfter"/>
</Target>
BeforeTargets
とAfterTargets
は既存のビルドプロセスを拡張するに使用できます。
たとえば、この属性を使用すると、CoreCompile(がMicrosoft.CSharp.targetsで定義される)の前にターゲットを簡単に実行できます。それがなければ、プロパティCoreCompileDependsOn
をオーバーライドする必要があります。
AfterTargets
がないと、拡張ポイントが定義されていない場合、ターゲットを次々に簡単に実行する方法がありません(ターゲットの最後に、オーバーライドできるプロパティを備えたCallTarget
)。
DependsOnTargets
、BeforeTargets
およびAfterTargets
が同じターゲットで使用される場合、実行の順序は次のとおりです。
DependsOnTargets
BeforeTargets
AfterTargets
<Target Name="MainTarget" DependsOnTargets="DefaultDependsOn">
<Message Text="Target : MainTarget"/>
</Target>
<Target Name="DefaultDependsOn">
<Message Text="Target : DefaultDependsOn"/>
</Target>
<Target Name="DefaultBeforeTarget" BeforeTargets="MainTarget">
<Message Text="Target : DefaultBeforeTarget"/>
</Target>
<Target Name="DefaultAfterTarget" AfterTargets="MainTarget">
<Message Text="Target : DefaultAfterTarget"/>
</Target>
Output
> Target : DefaultDependsOn
> Target : DefaultBeforeTarget
> Target : MainTarget
> Target : DefaultAfterTarget
答えはもっと単純だと思います。 DependsOnTargetsとAfterTargetsの効果は基本的に同じです。 BeforeTargetsおよびAfterTargetsの理由(Microsoftドキュメントから):
これにより、プロジェクトの作成者は既存のターゲットのセットを直接変更せずに拡張できます。
したがって、既存のターゲットBがあり、最初に実行する必要がある新しいターゲットAを追加する場合は、2つの選択肢があります。
ターゲットBを読み取るように変更します:DependsOnTargets = "A"。
ターゲットAを次のように変更します:BeforeTargets = "B"。
Bを変更できない場合(既存のMicrosoftターゲットなど)、BeforeTargetsが必要になります。
以前に提供された他の答えは正しいですが、AfterTargets
よりもDependsOnTargets
の主な利点であると私が考えるものについては、彼らは言及しなかったと思います。
DependsOnTargets
はMSBuildの最初から存在しています。 DependsOnTargets
の問題は、ターゲット作成者が拡張性を明示的に許可する必要があることです。これは、次のように、DependsOnTargets
値として使用されるプロパティを定義することによって行われます。
<PropertyGroup>
<SomeTargetDependsOnTargets>
Dependency1;Dependency2
</SomeTargetDependsOnTargets>
</PropertyGroup>
<Target Name="SomeTarget" DependsOnTargets="$(SomeTargetDependsOnTargets)">
...
</Target>
次に、SomeTargetDependsOnTargets
プロパティを次のように変更して、依存関係を追加します。
<SomeTargetDependsOnTargets>
$(SomeTargetDependsOnTargets);Dependency3
</SomeTargetDependsOnTargets>
このデザインの問題は、作成者が単にDependency1;Dependency2
プロパティに抽出するのではなく、カスタマイズできるように外部から変更する方法はありません。
一方、AfterTargets
は、元のターゲット作成者がDependsOnTargets
値を明示的にプロパティに抽出して拡張性を可能にする必要はありません。
DependsOnTarget-2つのタスクがあると仮定しましょう:1-プロジェクトのビルド、2-すべてのコンテンツのコピー。タスク2を実行してビルドを開始し、タスク宣言で依存関係を定義できます。したがって、タスク2がタスク1に依存することを定義すると、ビルドプロセスが開始し、タスク1を実行してから2を実行します。
AfterTargets-はるかに単純とは、他のターゲットの後に実行されるタスクのみを意味します。上から例をとると-タスク1の後に-プロジェクトをビルドしてタスク2を実行します。
これが役に立てば幸い