web-dev-qa-db-ja.com

「DependsOnTargets」と「AfterTargets」の違いは何ですか?

私はこれら2つを区別できません。助けてください!

55
Nam G VU

DependsOnTargets

前に実行する必要がありますターゲットを実行できるターゲットを定義します。

<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

BeforeTargetsとAfterTargets(MSBuild 4でのみ使用可能)

ターゲットが指定された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> 
    

BeforeTargetsAfterTargets既存のビルドプロセスを拡張するに使用できます。

たとえば、この属性を使用すると、CoreCompileがMicrosoft.CSharp.targetsで定義される)の前にターゲットを簡単に実行できます。それがなければ、プロパティCoreCompileDependsOnをオーバーライドする必要があります。

AfterTargetsがないと、拡張ポイントが定義されていない場合、ターゲットを次々に簡単に実行する方法がありません(ターゲットの最後に、オーバーライドできるプロパティを備えたCallTarget)。

DependsOnTargets、BeforeTargets、AfterTargetsの実行順序は?

DependsOnTargetsBeforeTargetsおよび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
    
67
Julien Hoarau

答えはもっと単純だと思います。 DependsOnTargetsとAfterTargetsの効果は基本的に同じです。 BeforeTargetsおよびAfterTargetsの理由(Microsoftドキュメントから):

これにより、プロジェクトの作成者は既存のターゲットのセットを直接変更せずに拡張できます。

したがって、既存のターゲットBがあり、最初に実行する必要がある新しいターゲットAを追加する場合は、2つの選択肢があります。

  1. ターゲットBを読み取るように変更します:DependsOnTargets = "A"。

  2. ターゲットAを次のように変更します:BeforeTargets = "B"。

Bを変更できない場合(既存のMicrosoftターゲットなど)、BeforeTargetsが必要になります。

5
Steve Robbins

以前に提供された他の答えは正しいですが、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値を明示的にプロパティに抽出して拡張性を可能にする必要はありません。

4
MarkPflug

DependsOnTarget-2つのタスクがあると仮定しましょう:1-プロジェクトのビルド、2-すべてのコンテンツのコピー。タスク2を実行してビルドを開始し、タスク宣言で依存関係を定義できます。したがって、タスク2がタスク1に依存することを定義すると、ビルドプロセスが開始し、タスク1を実行してから2を実行します。

AfterTargets-はるかに単純とは、他のターゲットの後に実行されるタスクのみを意味します。上から例をとると-タスク1の後に-プロジェクトをビルドしてタスク2を実行します。

これが役に立てば幸い

1