Quelle est la différence entre ‘DependsOnTargets’ et ‘AfterTargets’?

Je ne peux pas distinguer ces deux. S’il vous plaît aider!

DependsOnTargets

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

         Output > Target : DependencyTarget1 > Target : DependencyTarget2 > Target : DependsOn 

BeforeTargets et AfterTargets (Disponible uniquement dans MSBuild 4)

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

            Output > BeforeTarget run before : BeforeAndAfter > Target : BeforeAndAfter > AfterTarget run after : BeforeAndAfter 
  • Si vous avez plusieurs cibles devant 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 :

               

BeforeTargets et AfterTargets pourraient être utilisés pour étendre le processus de génération existant .

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

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 remplacer)

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 le suivant:

  • DependsOnTargets
  • BeforeTargets
  • La cible
  • AfterTargets

                 Output > Target : DefaultDependsOn > Target : DefaultBeforeTarget > Target : MainTarget > Target : DefaultAfterTarget 

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 existant de cibles sans les modifier directement.

Donc, si vous avez une cible B existante et que vous souhaitez append une nouvelle cible A qui doit être exécutée en premier, vous avez deux choix:

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

  2. Modifier la cible A à lire: BeforeTargets = “B”.

Si vous ne pouvez pas modifier B (par exemple, il s’agit d’une cible Microsoft existante), vous avez besoin de BeforeTargets.

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

AfterTargets – beaucoup plus simple signifie uniquement les tâches qui sont exécutées après d’autres cibles. Ainsi, en prenant l’exemple ci-dessus – après la tâche 1 – construire un projet, exécutez la tâche 2.

J’espère que ça aide

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 d’ AfterTargets rapport à DependsOnTargets .

DependsOnTargets existe depuis le début de MSBuild. Le problème avec DependsOnTargets , c’est qu’un auteur cible doit autoriser explicitement l’extensibilité. Cela se fait en définissant une propriété utilisée comme valeur DependsOnTargets , comme suit:

   Dependency1;Dependency2    ...  

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

  $(SomeTargetDependsOnTargets);Dependency3  

Le problème avec cette conception est que si l’auteur avait simplement inséré 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 la personnalisation.

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