Cibles de MSBuild
Mise à jour : novembre 2007
Les cibles groupent les tâches dans un ordre particulier et autorisent des sections du processus de génération à être appelées à partir de la ligne de commande. Les cibles sont souvent groupées en sections logiques afin de permettre un développement du fichier projet et une meilleure lisibilité. Par exemple, une cible peut supprimer tous les fichiers dans le répertoire de sortie pour préparer la génération, pendant qu'une autre compile les entrées pour le projet et les place dans le répertoire vide.
Déclaration des cibles dans le fichier projet
Les cibles sont déclarées dans le fichier projet avec l'élément Target. Par exemple, le code XML suivant crée une cible nommée Compile, qui appelle ensuite la tâche Csc avec la collection d'éléments Compile.
<Target Name="Compile>
<Csc Sources="@(Compile)" />
</Target>
Les cibles peuvent également utiliser l'attribut Condition. Si la condition spécifiée a la valeur false, la cible ne s'exécute pas, et le moteur MSBuild n'exécute pas les cibles spécifiées dans l'attribut DependsOnTargets. Pour plus d'informations sur les conditions, consultez Conditions MSBuild.
Analyse de dépendance
Dans des scénarios plus avancés, les cibles peuvent décrire les relations entre chacune d'elles et exécuter une analyse de dépendance, qui permet d'ignorer des sections entières du processus de génération si la cible correspondante est à jour. Vous pouvez déclarer les cibles qui doivent s'exécuter avant une cible spécifique à l'aide de l'attribut DependsOnTargets. Lors de l'exécution d'une cible, le moteur MSBuild exécute d'abord automatiquement toutes les cibles répertoriées dans cet attribut. Pour plus d'informations, consultez Comment : effectuer des générations incrémentielles.
Remarque : |
---|
Une cible ne s'exécute jamais deux fois pendant une même génération. Une fois exécutée, une cible est supposée avoir terminé sa tâche et ne sera plus exécutée, même si une cible suivante dépend d'elle dans la génération. |
Méthodes conseillées
Découper le fichier projet de cette manière permet d'en modifier certaines sections sans affecter les autres. Par exemple, une façon de générer un projet avec des ressources consiste à placer les tâches GenerateResourceet Csc dans la même cible, par exemple :
<Target Name="Build">
<GenerateResource
Sources="alpha.resx; beta.txt"
<Output
TaskParameter="OutputResources"
ItemName="Resources"/>
</GenerateResource>
<Csc
Sources="hello.cs"
Resources="@(Resources)"
OutputAssembly="hello.exe"/>
</Target>
Avec cette approche, le projet se génère comme prévu, mais la cible devient volumineuse et inflexible. Si vous souhaitiez ensuite ajouter d'autres tâches à exécuter entre GenerateResource et Csc, les rassembler toutes ensemble dans une cible rendrait le fichier projet très difficile à lire. De plus, la création de cibles de si grande taille et contenant tant de tâches rend difficile l'exécution de générations incrémentielles satisfaisantes - générations dans lesquelles seules les cibles n'ayant pas été générées avant ou les cibles n'étant pas à jour sont régénérées. Les cibles de grande taille vous empêchent également d'exécuter des cibles afin d'effectuer des tâches spécifiques. Dans l'exemple précité, il n'y a pas moyen de générer des ressources sans compilation.
Il est préférable de créer un fichier projet à l'aide de plusieurs cibles et d'exprimer explicitement les dépendances entre elles. Cette approche vous donne également la capacité d'exécuter chacune des cibles séparément et d'exécuter un plus petit jeu de tâches plutôt qu'une longue liste de tâches dans une cible à chaque génération. Dans cet exemple, chaque tâche est dans une cible séparée et l'attribut DependsOnTargets spécifie que la cible Resources doit s'exécuter avant que la cible Build puisse s'exécuter.
<Target Name="Resources">
<GenerateResource
Sources="alpha.resx; beta.txt"
<Output
TaskParameter="OutputResources"
ItemName="Resources"/>
</GenerateResource>
</Target>
<Target Name="Build" DependsOnTargets="Resources">
<Csc
Sources="hello.cs"
Resources="@(Resources)"
OutputAssembly="hello.exe"/>
</Target>
Voir aussi
Tâches
Comment : spécifier la cible à générer en premier
Comment : utiliser la même cible dans plusieurs fichiers projet