Partager via


Personnaliser la génération de la solution

Quand MSBuild génère un fichier solution, il le convertit en interne en fichier projet, puis génère ce dernier. Le fichier projet généré importe before.{solutionname}.sln.targets avant de définir des cibles et after.{solutionname}.sln.targets après avoir importé les cibles, notamment les cibles installées dans les répertoires $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportBefore et $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter.

Par exemple, vous pouvez définir une nouvelle cible pour écrire un message de journal personnalisé après avoir généré MyCustomizedSolution.sln en créant un fichier dans le même répertoire que celui nommé after.MyCustomizedSolution.sln.targets qui contient

<Project>
 <Target Name="EmitCustomMessage" AfterTargets="Build">
   <Message Importance="High" Text="The solution has completed the Build target" />
 </Target>
</Project>

La build de solution étant distincte des builds de projet, les paramètres définis ici n’affectent pas les builds de projet.

Important

La personnalisation de la génération de la solution de cette façon s’applique uniquement aux générations de ligne de commande avec MSBuild.exe. Elle ne s’applique pas aux générations à l’intérieur de Visual Studio. C’est pourquoi il n’est pas recommandé de placer la personnalisation au niveau de la solution. Une meilleure stratégie pour personnaliser tous les projets d’une solution consiste à utiliser les fichiers Directory.Build.props et Directory.build.targets dans le dossier de la solution, comme indiqué ailleurs dans cet article.

Lorsque vous souhaitez étendre de nombreux fichiers solution de la même façon, mais sans écrire dans le dossier $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ (ce qui demande généralement des autorisations élevées), vous pouvez créer les fichiers Directory.Solution.props et Directory.Solution.targets et les placer dans le chemin racine au-dessus des fichiers solution à étendre. Directory.Solution.props est importé au début du processus de build de la solution, Directory.Solution.targets à la fin. Lorsque vous générez un fichier de solution, Directory.Build.props et Directory.Build.targets ne sont pas importés. Vous devez donc utiliser Directory.Solution.props et Directory.Solution.targets à la place. Ils ne s’importent pas implicitement les uns les autres.

Lorsque Directory.Solution.props ou Directory.Solution.targets se trouvent dans un dossier racine, mais que sous ce dossier figure une solution que vous ne souhaitez pas importer, vous pouvez utiliser les fichiers propres à la solution mentionnés précédemment, before.{solutionname}.sln.targets et after.{solutionname}.sln.targets, pour définir les propriétés $(ImportDirectorySolutionProps) et $(ImportDirectorySolutionTargets) sur false. Vous avez également la possibilité d’utiliser les propriétés $(DirectorySolutionPropsPath) et $(DirectorySolutionTargetsPath) afin de spécifier un autre emplacement pour ces fichiers. Cette solution peut se révéler utile si différentes parties de vos solutions exigent certaines valeurs de propriété ou cibles communes.