Partager via


Ordre de génération des cibles

Les cibles doivent être ordonnées si l’entrée à une cible dépend de la sortie d’une autre cible. Vous pouvez utiliser ces attributs pour spécifier l’ordre dans lequel les cibles sont exécutées :

  • InitialTargets. Cet Project attribut spécifie les cibles qui s’exécutent en premier, même si les cibles sont spécifiées sur la ligne de commande ou dans l’attribut DefaultTargets .

  • DefaultTargets. Cet Project attribut spécifie les cibles exécutées si une cible n’est pas spécifiée explicitement sur la ligne de commande.

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

  • BeforeTargets et AfterTargets. Ces Target attributs 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 les tâches exécutées avant d’autres tâches.

Une cible n’est jamais exécutée deux fois pendant une build, même si une cible ultérieure dans la build dépend de celle-ci. Une fois qu’une cible a été exécutée, sa contribution à la génération est terminée.

Les cibles peuvent avoir un Condition attribut. Si la condition spécifiée est évaluée 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.

Cibles initiales

L’attribut InitialTargets de l’élément Project spécifie les cibles qui s’exécutent en premier, même si les cibles sont spécifiées sur la ligne de commande ou dans l’attribut DefaultTargets . Les cibles initiales sont généralement utilisées pour la vérification des erreurs.

La valeur de l’attribut InitialTargets peut être une liste de cibles délimitées par des points-virgules et triées. L’exemple suivant spécifie que la cible Warm s’exécute, puis que la cible Eject s’exécute.

<Project InitialTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

Les projets importés peuvent avoir leurs propres InitialTargets attributs. Toutes les cibles initiales sont agrégées et exécutées dans l’ordre.

Pour plus d’informations, consultez 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 cible ou les cibles générées si une cible n’est pas spécifiée explicitement dans une ligne de commande.

La valeur de l’attribut DefaultTargets peut être une liste ordonnée de cibles par défaut délimitées par des points-virgules. L’exemple suivant spécifie que la cible Clean s’exécute, puis que la cible Build s’exécute.

<Project DefaultTargets="Clean;Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

Vous pouvez remplacer les cibles par défaut à l’aide du commutateur -target sur la ligne de commande. L’exemple suivant spécifie que la cible Build s’exécute, puis que la cible Report s’exécute. Lorsque vous spécifiez des cibles de cette façon, toutes les cibles par défaut sont ignorées.

msbuild -target:Build;Report

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 d’abord les cibles initiales, puis exécute les cibles par défaut.

Les projets importés peuvent avoir leurs propres DefaultTargets attributs. Le premier DefaultTargets attribut rencontré détermine les cibles par défaut qui s’exécutent.

Pour plus d’informations, consultez Guide pratique pour spécifier la cible à générer en premier.

Première cible

S’il n’existe pas de cibles initiales, de cibles par défaut ou de cibles de ligne de commande, MSBuild exécute la première cible qu’il rencontre dans le fichier projet ou les fichiers projet importés.

Dépendances cibles

Les cibles peuvent décrire les 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 Serve cible dépend de la Chop cible et de la Cook cible. MSBuild exécute la Chop cible, puis exécute la Cook cible avant d’exécuter la Serve cible.

Remarque

Les cibles standard du Kit de développement logiciel (SDK) définissent un certain nombre de DependsOn propriétés 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 DependsOn propriétés 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 cible en utilisant les attributs BeforeTargets et AfterTargets.

Considérez le script suivant.

<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 Optimize intermédiaire qui s’exécute après la Compile cible, mais avant la Link cible, ajoutez la cible suivante n’importe où dans l’élément Project .

<Target Name="Optimize" AfterTargets="Compile">
    <Message Text="Optimizing" />
</Target>

Alternativement, spécifiez l'ordre comme

<Target Name="Optimize" BeforeTargets="Link">
    <Message Text="Optimizing" />
</Target>

Il n’est pas utile de spécifier à la foisBeforeTargets et AfterTargets sur la même cible. Comme décrit dans la section suivante, seule la première cible rencontrée provoquera l’exécution de la nouvelle cible.

Déterminer l’ordre de construction cible

MSBuild détermine l’ordre de génération cible comme suit :

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

  2. Les cibles spécifiées sur la ligne de commande par le commutateur -target sont exécutées. Si vous ne spécifiez aucune cible sur la ligne de commande, les DefaultTargets cibles sont exécutées. Si aucun des deux n’est présent, la première cible rencontrée est exécutée.

  3. L’attribut Condition de la cible est évalué. Si l’attribut Condition est présent et est évalué à false, la cible n’est pas exécutée et n’a aucun effet supplémentaire sur la construction.

    Les autres cibles qui répertorient la cible conditionnelle dans BeforeTargets ou AfterTargets s’exécutent toujours dans l’ordre prescrit, quel que soit le résultat de la condition.

  4. Avant l’exécution ou l’annulation de l’exécution de la cible, ses DependsOnTargets cibles sont exécutées, sauf si l’attribut Condition est appliqué à la cible et est évalué à 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 up-to-date (voir compilation incrémentielle). Cette vérification est effectuée juste avant d’exécuter les tâches à l’intérieur de la cible et n’affecte pas l’ordre d’exécution des cibles.

  5. Avant que la cible soit exécutée ou ignorée, toute autre cible qui répertorie la cible dans un BeforeTargets attribut est exécutée.

  6. Avant l'exécution de la cible, son attribut Inputs et son attribut Outputs sont comparés. Si MSBuild détermine que les fichiers de sortie sont obsolètes en ce qui concerne le fichier d’entrée ou les fichiers correspondants, MSBuild exécute la cible. Sinon, MSBuild ignore la cible.

  7. Une fois la cible exécutée ou ignorée, toute autre cible qui la répertorie dans un AfterTargets attribut est exécutée.