MSBuild Solution (sln)

12. August 2015

Hier ein paar Tips und Tricks wie man den Build von Visual Studio und per MSBuild.exe vereinheitlicht.

Man kann zwar die Solution über eine MSBuild Task erstellen, dafür benötigt man aber ein separates Buildfile. Leider kennt aber Visual Studio dieses File nicht und wird es nicht ausführen.

<MSBuild Projects="abc.sln" Properties="Configuration=Debug;Plattform=Any CPU"/>

Heißt alle Besonderheiten werden nicht im Visual Studio Build durchgeführt. Um nun alle gewünschten Verarbeitungen zu integrieren kann man die Solution erweitern. Als erstes ruft man MSBuild mit der Solution auf:

msbuild.exe abc.sln /p:Configuration=Debug;Platform=Any CPU

Wählt man keine Configuration und Platform, so wird die im Solutionfile hinterlegte verwendet. Genauso kann man über /t:target noch den entsprechenden Build ausführen. Nun arbeiten der Build und Visual Studio auf den gleichen Dateien. Das Solutionfille ist aber kein MSBuildfile, es wird aber darin umgewandelt. Mit

set msbuildemitsolution=1
msbuild.exe abc.sln

wird dieses auch auf der Platte abgelegt. Wirft man einen Blick hinein, so findet man

<Import Projects="before.abc.sln.targets" Condition="exists(‘before.abc.sln.targets’)"/>
<Import Projects="after.abc.sln.targets" Condition="exists(‘after.abc.sln.targets’)"/>

Man kann also den Build anpassen indem man neben dem Solutionfile Dateien mit entsprechenden Namen anlegt. Diese werden auch von Visual Studio, ausgenommen von den Versionen 2010 und 2012, ausgeführt.

Ein Build über die Commandline und aus Visual Studio laufen damit auf den gleichen Dateien. Ein Fehler in den Buildfiles fällt somit nicht erst bei einem automatisierten Build auf. Leider konnte ich noch nicht prüfen ob auch im TFS die before und after target ausgeführt werden.