Je ne peux pas distinguer ces deux. Veuillez aider!
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
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)
Lorsque DependsOnTargets
, BeforeTargets
et AfterTargets
sont utilisés sur la même cible, l'ordre d'exécution est:
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
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:
Modifiez la cible B pour lire: DependsOnTargets = "A".
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.
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é.
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