Ordre de génération des cibles
Les cibles doivent être classées si l'entrée d'une cible dépend de la sortie d'une autre cible. Il existe plusieurs méthodes pour spécifier l'ordre d'exécution des cibles.
Cibles initiales
Cibles par défaut
Première cible
Dépendances cible
BeforeTargets et AfterTargets (MSBuild 4.0)
Une cible n'est jamais exécutée deux fois pendant une build, même si une cible suivante dans la build dépend d'elle. Une fois qu'une cible a été exécutée, sa contribution à la build est terminée.
Les cibles peuvent avoir un attribut Condition. Si la condition spécifiée prend la valeur false, la cible n'est pas exécutée et n'a aucun effet sur la build. Pour plus d'informations sur les conditions, consultez Conditions MSBuild.
Cibles initiales
L'élément Project a un attribut InitialTargets facultatif dont la valeur peut être une liste triée de cibles délimitées par des points-virgules. Par exemple :
<Project InitialTargets="Warm;Eject" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
spécifie que la cible Warm s'exécute, puis que la cible Eject s'exécute.
Les projets importés peuvent avoir leurs propres attributs InitialTargets. Toutes les cibles initiales sont regroupées et exécutées dans l'ordre indiqué. Les cibles initiales sont généralement utilisées pour la vérification des erreurs.
Les cibles initiales peuvent être substituées à l'aide de la ligne de commande. Par exemple :
msbuild /target:Build;Report
spécifie que la cible Build s'exécute, puis que la cible Report s'exécute. Lorsque les cibles sont spécifiées de cette manière, les cibles initiales sont ignorées.
Pour plus d'informations, consultez Comment : spécifier la cible à générer en premier.
Cibles par défaut
L'élément Project a également un attribut DefaultTargets facultatif dont la valeur peut être une liste triée de cibles par défaut délimitées par des points-virgules. Par exemple :
<Project DefaultTargets="Clean;Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
spécifie que la cible Clean s'exécute, puis que la cible Build s'exécute.
Les projets importés peuvent avoir leurs propres attributs DefaultTargets. Le premier attribut DefaultTargets rencontré détermine les cibles par défaut qui s'exécuteront.
Les cibles par défaut peuvent être substituées à l'aide de la ligne de commande. Par exemple :
msbuild /target:Build;Report
spécifie que la cible Build s'exécute, puis que la cible Report s'exécute. Lorsque les cibles sont spécifiées de cette manière, les cibles par défaut sont ignorées.
Si les cibles initiales et les cibles par défaut sont spécifiées, et si aucune cible de ligne de commande n'est spécifiée, MSBuild exécute en premier les cibles initiales, puis les cibles par défaut.
Première cible
S'il n'y a pas de cible initiale, de cible par défaut ou de cible de ligne de commande, MSBuild exécute la première cible qu'il rencontre dans le fichier projet ou dans tout fichier projet importé.
Dépendances cible
Les cibles peuvent décrire des relations de dépendance entre elles. L'attribut DependsOnTargets indique qu'une cible dépend d'autres cibles. Par exemple :
<Target Name="Serve" DependsOnTargets="Chop;Cook" />
indique à MSBuild que la cible Serve dépend de la cible Chop et de la cible Cook. MSBuild exécute la cible Chop, puis la cible Cook et enfin la cible Serve.
BeforeTargets et AfterTargets
Dans MSBuild 4.0, vous pouvez spécifier l'ordre des cibles à l'aide des attributs BeforeTargets et AfterTargets.
Prenons le script suivant :
<Project DefaultTargets="Compile;Link" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Compile">
<Message Text="Compiling" />
</Target>
<Target Name="Link">
<Message Text="Linking" />
</Target>
</Project>
Pour créer une cible intermédiaire Optimize qui s'exécute après la cible Compile, mais avant la cible Link, ajoutez la cible suivante n'importe où dans l'élément Project.
<Target Name="Optimize"
AfterTargets="Compile" BeforeTargets="Link">
<Message Text="Optimizing" />
</Target>
Détermination de l'ordre de génération des cibles
MSBuild détermine l'ordre de génération des cibles comme suit :
Les cibles spécifiées sur la ligne de commande par le commutateur /target sont exécutées. Si aucune cible n'est spécifiée, les cibles InitialTargets sont exécutées, suivies par les cibles DefaultTargets. Si aucune n'est présente, la première cible rencontrée est exécutée.
L'attribut Condition de la cible est évalué. Si l'attribut Condition est présent et a la valeur false, la cible n'est pas exécutée et n'a aucun effet sur la build.
Avant qu'une cible soit exécutée, ses cibles DependsOnTargets sont exécutées.
Avant qu'une cible soit exécutée, toute cible qui la répertorie dans un attribut BeforeTargets est exécutée.
Avant qu'une cible soit exécutée, ses attributs Inputs et Outputs sont comparés. Si MSBuild détermine que des fichiers de sortie sont obsolètes par rapport au(x) fichier(s) d'entrée correspondant(s), MSBuild exécute la cible. Sinon, MSBuild ignore la cible.
Une fois qu'une cible a été exécutée ou ignorée, toute cible qui la répertorie dans un attribut AfterTargets est exécutée.