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. Vous pouvez utiliser les attributs suivants pour spécifier l’ordre d’exécution des cibles :
InitialTargets
. L’attributProject
spécifie les cibles qui sont exécutées en premier, même si des cibles sont spécifiées sur la ligne de commande ou dans l’attributDefaultTargets
.DefaultTargets
. Cet attributProject
spécifie les cibles à exécuter si aucune cible n’est spécifiée explicitement sur la ligne de commande.DependsOnTargets
. Cet attributTarget
spécifie les cibles qui doivent s’exécuter avant que cette cible puisse s’exécuter.Voir
BeforeTargets
etAfterTargets
. Ces attributsTarget
spécifient que cette cible doit s’exécuter avant ou après les cibles spécifiées.
En général, vous ne devez pas dépendre de l’ordre de déclaration pour spécifier quelles tâches s'exécutent avant d'autres tâches.
Une cible n’est jamais exécutée deux fois pendant une génération, même si une cible suivante de la génération en dépend. Une fois qu’une cible a été exécutée, sa contribution à la génération est terminée.
Les cibles peuvent avoir un attribut Condition
. Si la condition spécifiée a la valeur false
, la cible n’est pas exécutée et n’a aucun effet sur la génération. Pour plus d’informations sur les conditions, consultez l’article Conditions (Conditions MSBuild).
Cibles initiales
L’attribut InitialTargets
de l’élément Project spécifie les cibles qui sont exécutées en premier, même si des cibles sont spécifiées sur la ligne de commande ou dans l’attribut DefaultTargets
. En règle générale, les cibles initiales sont utilisées pour la vérification des erreurs.
La valeur de l’attribut InitialTargets
peut être une liste ordonnée de cibles séparées par des points-virgules. Dans l’exemple suivant, la cible Warm
est exécutée avant la cible Eject
.
<Project InitialTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
Les projets importés peuvent avoir leurs propres attributs InitialTargets
. Toutes les cibles initiales sont agrégées et exécutées dans l’ordre.
Pour plus d’informations, consultez l’article Guide pratique pour spécifier la cible à générer en premier.
Cibles par défaut
L’attribut DefaultTargets
de l’élément Project spécifie la ou les cibles qui sont générées si aucune cible n’est spécifiée explicitement sur une ligne de commande.
La valeur de l’attribut DefaultTargets
peut être une liste ordonnée de cibles par défaut séparées par des points-virgules. Dans l’exemple suivant, la cible Clean
est exécutée avant la cible Build
.
<Project DefaultTargets="Clean;Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
Vous pouvez remplacer les cibles par défaut avec le commutateur -target en ligne de commande. Dans l’exemple suivant, la cible Build
est exécutée avant la cible Report
. Si vous spécifiez des cibles de cette manière, les cibles par défaut sont ignorées.
msbuild -target:Build;Report
Si des cibles initiales et des cibles par défaut sont spécifiées et si aucune cible de ligne de commande n’est indiquée, MSBuild exécute d’abord les cibles initiales, puis les cibles par défaut.
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.
Pour plus d’informations, consultez l’article Guide pratique pour spécifier la cible à générer en premier.
Première cible
En l’absence de cibles initiales, cibles par défaut ou cibles de ligne de commande, MSBuild exécute la première cible qu’il rencontre dans le fichier projet ou dans les fichiers projet importés.
Dépendances de cible
Les cibles peuvent décrire les relations de dépendance existant les unes avec les autres. 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 des cibles Chop
et Cook
. MSBuild exécute la cible Chop
, puis la cible Cook
, avant la cible Serve
.
Remarque
Les cibles standard du Kit de développement logiciel (SDK) définissent un certain nombre de propriétés DependsOn
qui contiennent la liste des cibles qui sont des dépendances pour cette cible (par exemple, $(BuildDependsOn)
, $(CleanDependsOn)
etc.). Par exemple,
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">
Pour personnaliser un projet, vous pouvez remplacer les propriétés DependsOn
par des cibles personnalisées supplémentaires qui étendent le processus de génération, comme décrit dans Étendre le processus de génération Visual Studio.
BeforeTargets et AfterTargets
Vous pouvez spécifier l’ordre des cibles à l’aide des attributs BeforeTargets
et AfterTargets
.
Examinez le script ci-dessous.
<Project DefaultTargets="Compile;Link" xmlns="http://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
s’exécutant 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">
<Message Text="Optimizing" />
</Target>
Vous pouvez également spécifier l’ordre de la façon suivante
<Target Name="Optimize" BeforeTargets="Link">
<Message Text="Optimizing" />
</Target>
Il n’est pas utile de spécifier à la fois BeforeTargets
et AfterTargets
sur la même cible. Comme indiqué dans la section suivante, seule la première cible rencontrée entraîne l’exécution de la nouvelle cible.
Déterminer l’ordre de génération des cibles
MSBuild détermine l’ordre de génération des cibles comme suit :
Les cibles
InitialTargets
sont exécutées.Les cibles spécifiées en ligne de commande par le commutateur -target sont exécutées. Si vous n’indiquez aucune cible sur la ligne de commande, les cibles
DefaultTargets
sont alors exécutées. En l’absence de ces cibles, la première cible rencontrée est exécutée.L’attribut
Condition
de la cible est évalué. Si l’attributCondition
est indiqué et défini sur la valeurfalse
, la cible n’est pas exécutée et n’a aucun effet sur la génération.Les autres cibles qui listent la cible conditionnelle dans
BeforeTargets
ouAfterTargets
s’exécutent toujours dans l’ordre indiqué.Avant que la cible soit exécutée ou ignorée, ses cibles
DependsOnTargets
sont exécutées, à moins que l’attributCondition
soit appliqué à la cible et s’évalue àfalse
.Remarque
Une cible est considérée comme ignorée si elle n’est pas exécutée, car ses éléments de sortie sont à jour (voir build incrémentielle). Cette vérification est effectuée juste avant d’exécuter les tâches au sein de la cible et n’affecte pas l’ordre d’exécution des cibles.
Avant qu’une cible soit exécutée ou ignorée, toute cible listant la cible dans un attribut
BeforeTargets
est exécutée.Avant l’exécution de la cible, ses attributs
Inputs
etOutputs
sont comparés. Si MSBuild détermine que des fichiers de sortie sont obsolètes en ce qui concerne le ou les fichiers d’entrée correspondants, MSBuild exécute la cible. Sinon, MSBuild ignore la cible.Une fois qu’une cible est exécutée ou ignorée, toute cible qui la liste dans un attribut
AfterTargets
est exécutée.