Im elften – und vorletzten – Teil der Artikelserie “Das MSBuild Universum” möchte ich die Möglichkeiten aufzeigen, die es gibt, um den Standard-Buildprozess von .NET Anwendungen zu erweitern. Im Rahmen der Artikelserie wurden bereits die folgenden Artikel veröffentlicht
- MSBuild – Ein Überblick
- MSBuild – Leichte Kost
- MSBuild – Jenseits von HelloBuildWorld (MSBuild Properties)
- MSBuild Items – Die Planeten im Universum
- MSBuild Tasks - Die Umlaufbahnen im Universum
- MSBuild Conditions – Die Wurmlöcher des Universums
- MSBuild Custom Tasks – Sternschnuppen im MSBuild Universum
- MSBuild Targets – Die Asteroiden im MSBuild Universum nutzen
- MSBuild Logger - Reisen im Universum sollte man protokollieren
- MSBuild Batching und MSBuild Choose – Die Flugbahnen von Körpern im Universum beeinflussen
Standard Möglichkeiten (Visual Studio UI)
Die Standardmöglichkeiten ein Build-Script zu erweitern wird wohl jeder .NET Entwickler kennen. Über die Projekteigenschaften kann man sowohl das PreBuild- als auch das PostBuild-Event anpassen und hier eigene Anweisungen hinterlegen.

In die hier gezeigten Textboxen kann man einfach Anweisungen eingeben, die dann ausgeführt werden. Alternativ kann man auch den Makro Dialog (Abbildung 2) verwenden um auf vordefinierte MSBuild-Properties zugreifen zu können.
Mit dieser Option kann man schon recht viele Anforderungen abdecken, jedoch reicht das nicht in allen Fällen aus, manchmal muss einfach mehr Flexibilität her. Wer die Artikelserie bis hierher durchgearbeitet hat, ist in der glücklichen Lage die wichtigen MSBuild Features zu kennen und kann noch etwas mehr machen, als Visual Studio in der UI zulässt. :)
Erweiterte Möglichkeiten (MSBuild Script)
Wem die eben gezeigten Möglichkeiten nicht ausreichen, der kann auf eines der 14 vorhandenen Build Targets zurückgreifen und hier manuell die Anpassung vornehmen
- BeforeBuild
- AfterBuild
- BeforeRebuild
- AfterRebuild
- BeforeResolveReferences
- AfterResolveReferences
- BeforeResGen
- AfterResGen
- BeforeCompile
- AfterCompile
- BeforeClean
- AfterClean
- BeforePublish
- AfterPublish
Wie man diese Targets verwendet ist recht einfach, man deklariert diese Targets als wären es Custom-Targets.
Das BeforeClean Target überschreiben
Das Überschreiben eines Standard-BuildTargets ist einfach, hierbei ist jedoch zu beachten dass die angepasste Version nach der Originalversion im Build-Script stehen muss.
Alle 14 Standard Build-Targets werden über das TARGET File Microsoft.Common.targets ausgeliefert, daher müssen die überschriebenen Versionen nach dem Standard Import Statement
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
angeordnet werden.
Exemplarisch möchte ich an dieser Stelle einfach das Standard-Target BeforeClean überschreiben, hierbei soll einfach vor jedem Clean-Vorgang eine Warnung erstellt und ausgegeben werden.
Mehr als das hinzufügen von
<Target Name="BeforeClean">
<Warning Text="MSBuild is going to clean up now!" />
</Target>
ist nicht nötig. Wenn man die Projektdatei nun mit Visual Studio kompiliert, wird automatisch die zuvor definierte Warnung im Build-Fenster angezeigt und das sogar in der vom Entwickler gewohnten Form :) … MSBuild ist doch herrlich :)
Wie so vieles in MSBuild, ist auch das hinterlegen von angepassten Anweisungen in vorhandenen Buildskripten (oder Projektdateien) kein Problem und basiert lediglich auf den Basics von MSBuild.
Fazit
Der Buildprozess von eigenen Anwendungen kann auch über die Grenze der Visual Studio UI hinweg einfach und schnell angepasst werden, was wieder einmal die Macht von MSBuild zeigt.
Langsam aber sicher nähere ich mich dem Ende der Artikelserie, was jedoch nicht bedeuten wird, dass es auf meinem Blog nichts mehr von MSBuild zu lesen geben wird. Im Rahmen der Artikelserie sind mir viele gute und nützliche Erweiterungspunkte aufgefallen, die ich nach und nach bedienen und hier festhalten werde.
In diesem Sinne hoffe ich, auch für den letzten Teil der Artikelserie viele Leser begeistern zu können. Denn…
Nicht nur C#, sondern auch MSBuild verwendet Ihr jeden Tag, also schaut was ihr daraus machen könnt :)