Anpassen des Projektmappenbuilds

Wenn MSBuild eine Projektmappendatei erstellt, wird diese zuerst intern in eine Projektdatei übersetzt, die dann erstellt wird. Die generierte Projektdatei importiert before.{solutionname}.sln.targets, bevor sie Ziele definiert und after.{solutionname}.sln.targets nachdem sie Ziele importiert hat. Dazu gehören auch die Ziele, die in den Verzeichnissen $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportBefore und $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter installiert sind.

Sie können beispielsweise ein neues Ziel definieren, um eine benutzerdefinierte Protokollmeldung zu schreiben, nachdem MyCustomizedSolution.sln erstellt wurde, indem Sie eine Datei in demselben Verzeichnis mit dem Namen after.MyCustomizedSolution.sln.targets erstellen, die Folgendes enthält:

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

Der Projektmappenbuild ist von den Projektbuilds getrennt, sodass sich die Einstellungen hier nicht auf Projektbuilds auswirken.

Wichtig

Wenn auf diese Weise der Projektmappenbuild angepasst wird, werden die Änderungen nur auf Builds mit MSBuild.exe über die Befehlszeile angewendet. Sie werden nicht auf Builds innerhalb von Visual Studio angewendet. Aus diesem Grund ist es nicht empfehlenswert, Anpassungen auf Projektmappenebene abzulegen. Eine bessere Alternative für die benutzerdefinierte Anpassung aller Projekte in einer Projektmappe ist die Verwendung der Dateien Directory.build.props und Directory.build.targets im Projektmappenordner, wie an anderer Stelle in diesem Artikel erläutert.

Wenn Sie viele Projektmappendateien haben, die Sie auf dieselbe Weise erweitern möchten, aber nicht in den Ordner $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ schreiben möchten (was in der Regel erhöhte Berechtigungen erfordert), können Sie die Dateien Directory.Solution.props und Directory.Solution.targets erstellen und sie im Stammverzeichnis über den zu erweiternden Projektmappendateien ablegen. Directory.Solution.props wird zu Beginn der Erstellung der Projektmappe und Directory.Solution.targets am Ende der Erstellung der Projektmappe importiert. Wenn Sie eine Projektmappendatei erstellen, werden Directory.Build.props und Directory.Build.targets nicht importiert, so dass Sie stattdessen Directory.Solution.props und Directory.Solution.targets verwenden müssen. Sie importieren sich nicht implizit gegenseitig.

Wenn Sie Directory.Solution.props oder Directory.Solution.targets in einem Stammordner haben, aber eine Projektmappe unter diesem Ordner haben, die Sie nicht importieren möchten, können Sie die zuvor erwähnten projektmappenspezifischen Dateien before.{solutionname}.sln.targets und after.{solutionname}.sln.targets verwenden und die Eigenschaften $(ImportDirectorySolutionProps) und $(ImportDirectorySolutionTargets) auf „false“ setzen. Oder Sie können die Eigenschaften $(DirectorySolutionPropsPath) und $(DirectorySolutionTargetsPath) verwenden, um einen anderen Speicherort für diese Dateien anzugeben. Dies kann hilfreich sein, wenn Sie verschiedene Teilmengen Ihrer Projektmappen haben, für die bestimmte Eigenschaftswerte oder Zielvorgaben erforderlich sind, die allen Teilmengen gemeinsam sind.