web-dev-qa-db-fra.com

Quelle est la différence entre «DependsOnTargets» et «AfterTargets»?

Je ne peux pas distinguer ces deux. Veuillez aider!

55
Nam G VU

DependsOnTargets

Définit les cibles qui doivent être exécutées avant la cible peut être exécutée.

<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 et AfterTargets (uniquement disponible dans MSBuild 4)

Indique que la cible doit exécuter avant ou après la ou les cibles spécifiées.

<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
  • Si vous avez plusieurs cibles qui doivent s'exécuter avant ou après la même cible spécifiée, elles seront exécutées dans l'ordre de déclaration:

    <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 et AfterTargets pourraient être utilisés pour étendre le processus de construction existant.

Par exemple, avec ces attributs, vous pouvez facilement exécuter une cible avant CoreCompile ( définit dans Microsoft.CSharp.targets ). Sans cela, vous devrez remplacer la propriété CoreCompileDependsOn.

Sans AfterTargets vous n'avez aucun moyen d'exécuter facilement une cible après une autre si aucun point d'extension n'est défini (CallTarget à la fin de la cible avec une propriété que vous pouvez surcharger)

Ordre d'exécution DependsOnTargets, BeforeTargets et AfterTargets?

Lorsque DependsOnTargets, BeforeTargets et AfterTargets sont utilisés sur la même cible, l'ordre d'exécution est:

  • DependsOnTargets
  • BeforeTargets
  • La cible
  • 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

Je pense que la réponse est beaucoup plus simple. L'effet de DependsOnTargets et AfterTargets est essentiellement le même. La raison de BeforeTargets & AfterTargets (à partir de la documentation Microsoft):

Cela permet à l'auteur du projet d'étendre un ensemble de cibles existant sans les modifier directement.

Donc, si vous avez une cible B existante et que vous souhaitez ajouter une nouvelle cible A qui doit s'exécuter en premier, vous avez deux choix:

  1. Modifiez la cible B pour lire: DependsOnTargets = "A".

  2. Modifiez la cible A pour lire: BeforeTargets = "B".

Si vous ne pouvez pas modifier B (par exemple, c'est une cible Microsoft existante), c'est à ce moment que vous avez besoin de BeforeTargets.

5
Steve Robbins

Bien que les autres réponses fournies précédemment soient correctes, je pense qu'elles n'ont pas mentionné ce que je pense être le principal avantage de AfterTargets sur DependsOnTargets.

DependsOnTargets existe depuis le début de MSBuild. Le problème avec DependsOnTargets, est qu'il nécessite qu'un auteur cible autorise explicitement l'extensibilité. Cela se fait en définissant une propriété qui est utilisée comme valeur DependsOnTargets, comme suit:

<PropertyGroup>
   <SomeTargetDependsOnTargets>
     Dependency1;Dependency2
   </SomeTargetDependsOnTargets>
</PropertyGroup>

<Target Name="SomeTarget" DependsOnTargets="$(SomeTargetDependsOnTargets)">
 ...
</Target>

Vous pouvez ensuite ajouter une dépendance en modifiant la propriété SomeTargetDependsOnTargets comme suit:

<SomeTargetDependsOnTargets>
    $(SomeTargetDependsOnTargets);Dependency3
</SomeTargetDependsOnTargets>

Le problème avec cette conception, c'est que si l'auteur avait simplement incorporé Dependency1;Dependency2 plutôt que de l'extraire dans une propriété, il n'y aurait aucun moyen de le modifier en externe pour permettre une personnalisation.

AfterTargets, d'autre part, n'exige pas que l'auteur de la cible d'origine ait explicitement extrait la valeur DependsOnTargets dans une propriété pour permettre l'extensibilité.

4
MarkPflug

DependsOnTarget - supposons que vous ayez deux tâches: 1 - Construire un projet, 2 - Copier tout le contenu. Vous pouvez démarrer votre construction en exécutant la tâche 2, puis dans la déclaration de tâche, définir ses dépendances. Donc, si vous définissez cette tâche 2 dépend de la tâche 1, le processus de construction démarrera et exécutera la tâche 1 puis 2.

AfterTargets - beaucoup plus simple signifie uniquement les tâches qui sont exécutées après d'autres cibles. Donc, en prenant l'exemple ci-dessus - après la tâche 1 - le projet de construction exécute la tâche 2.

J'espère que ça aide

1
Leszek Wachowicz