Partager via


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’attribut 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.

  • DefaultTargets. Cet attribut Project spécifie les cibles à exécuter si aucune cible n’est spécifiée explicitement sur la ligne de commande.

  • DependsOnTargets. Cet attribut Target spécifie les cibles qui doivent s’exécuter avant que cette cible puisse s’exécuter.

  • Voir BeforeTargets et AfterTargets. Ces attributs Target 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 :

  1. Les cibles InitialTargets sont exécutées.

  2. 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.

  3. L’attribut Condition de la cible est évalué. Si l’attribut Condition est indiqué et défini sur la valeur false, 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 ou AfterTargets s’exécutent toujours dans l’ordre indiqué.

  4. Avant que la cible soit exécutée ou ignorée, ses cibles DependsOnTargets sont exécutées, à moins que l’attribut Condition 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.

  5. Avant qu’une cible soit exécutée ou ignorée, toute cible listant la cible dans un attribut BeforeTargets est exécutée.

  6. Avant l’exécution de la cible, ses attributs Inputs et Outputs 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.

  7. 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.