Wie bereits angekündigt, beginnt mit diesem Post eine kleine MSBuild Serie. Ziel der Serie ist es einfach und praktisch die Möglichkeiten von MSBuild aufzuzeigen.
Die MSBuild Konfigurationsdateien
Wie bereits erwähnt ist jede VisualStudio Projektdatei eine MSBuild Konfigurationsdatei, die alle wichtigen Einstellungen und Informationen für den Buildvorgang beinhaltet. Visual Studio ist in vielen Bereichen einfach nur eine nette UI, die einem das Schreiben von MSBuild Konfigurationsdateien abnimmt.
Hello Build World
Als einfaches Beispiel für diesen Post möchte ich eine kleine “Hello Build World” Projektdatei erstellen. Hierzu werden lediglich einfache und leicht verständliche MSBuild Einstellungen verwendet.
Das Rootelement
Wie jedes XML Dokument hat auch eine MSBuild Konfigurationsdatei ein XML-Rootelement, das “Project”-Node. Das “Project”-Node bildet demnach den Container für alle Einstellungen und Anweisungen für einen Buildvorgang. Wie sollte es anders sein erhält der ambitionierte Entwickler IntelliSense im XML Dokument sobald er den XML-Namespace des Schemas eingebunden hat. Listing 1 zeigt das Root-Element der HelloBuildWorld.proj
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- some content -->
</Project>
MSBuild Targets und MSBuild Tasks
Nachdem das Rootelement definiert wurde, geht es direkt ans eingemachte, die MSBuild Targets. Buid-Targets stellen einen Container für mehrere atomare Schritte dar. Ein solcher Schritt wird in MSBuild als “Task” bezeichnet. MSBuild liefert eine Reihe von Tasks mit aus, die direkt durch die XML-Konfiguration verwendet und parametrisiert werden können. Natürlich hat man als .NET Entwickler auch die Möglichkeit eigene, spezielle Tasks zu entwickeln um diese dann in Build-Files zu verwenden. - Doch zunächst zurück zum Target.
Ein Target hat in seiner einfachsten Form lediglich das Attribut “Name” gefüllt und verfügt über einen MSBuild Task (ok, es könnte auch keinen Task enthalten, aber würde das Sinn machen?!) Listing 2 zeigt ein MSBuild-Target in der einfachsten Form mit dem Namen “HelloBuildWorld”
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="HelloBuildWorld">
</Target>
</Project>
Damit unser MSBuild-File nun auch über etwas Logik verfügt, erweitern wir es noch um einen Task der für die Ausgabe einer Message verantwortlich ist, den “Message”-Task.
Der MSBuild – Message Task
Wie der Name bereits sagt, ist der Message Task dafür verantwortlich einen beliebigen Text in den Output zu schreiben. Der Message Task verfügt auch lediglich über zwei Properties
- Text ( Die Meldung die angezeigt werden soll)
- Importance (Der Schweregrad der Meldung)
- Datentyp: String
- gültige Werte (“high”, “normal”, “low”)
- Standardwert “normal”
Erweitert sieht das vorhandene HelloBuildWorld.proj nun so aus
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="HelloBuildWorld">
<Message Text="Hello MSBuild world!" Importance="normal"/>
</Target>
</Project>
MSBuild Files – Die Ausführung eines Build Scripts
Ein erstelltes MSBuild-File kann man, wie sollte es anders sein? Durch msbuild.exe, die eigentliche Build-Engine. Die MSBuild.exe kann man einfach über die Visual Studio Command-Line starten, hier ist das entsprechende Verzeichnis, in dem sich die Anwendung befindet, in der Path-Variable angegeben.
MSBuild.exe benötigt in unserem Fall zwei Parameter
- Den Pfad zur HelloBuildWorld.proj Datei
- Den Namen des MSBuild-Targets, welches ausgeführt werden soll
Der Aufruf unsers Beispiels sieht also so aus
msbuild HelloBuildWorld.proj /t:HelloBuildWorld
Der Aufruf kann optional noch durch den Parameter “nologo” erweitert werden, damit der Microsoft Header in der Ausgabe wegfällt. Unser Build-File generiert diesen Output
Neben den einigen Rahmeninformationen, die eigentlich selbsterklärend sind, findet man in Zeile vier die zuvor erstellte Message.
Whats next?
Nun im nächsten Teil werde ich das “HelloBuildWorldReloaded” MSBuild-File zeigen, welches etwas dynamischere Inhalte visualisieren kann. Außerdem kommen noch weitere Build-Tasks….