11 October 2010 HowTo, MSBuild, Zippen Robert Muehsig

image

Nachdem im letzten HowTo behandelt wurde, wie man Tests mit in das Buildscript integriert, kommen wir nun zu einer einfachen Methode, wie man das Build automatisch zippen kann.

Die Magie beruht auf dem MSBuildCommunity Tasks Projekt.

Ausgangsszenario

Die Solution vom letzten Blogpost habe ich einfach weitergestrickt und zudem habe ich mir die neuste Version der MSBuildCommunity Tasks runtergeladen. Kleiner Tipp am Rande: Der MSI Installer wollte nicht, daher habe Zip mit Source runtergeladen. Dort gibt es folgende Datein, die für uns interessant sind:

image

Im MSBuild Script muss folgende Referenz rein:

<Import Project="$(MSBuildStartupDirectory)\Lib\MSBuild.Community.Tasks.Targets"/>

Damit holen wir uns quasi die verschiedenen Tasks in unser Buildfile mit rein und können sie verwenden.

Das Zippen oder das Problem mit der Doku

Das MSBuildCommunity Task Projekt ist recht groß, aber leider irgendwie scheint es für mich recht undokumentiert. In diesem Post hab ich den Aufruf des ZipTasks gefunden.

Hier mein ganzes MSBuild Script, wichtig ist das Target "Zip”

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<Import Project="$(MSBuildStartupDirectory)\Lib\MSBuild.Community.Tasks.Targets"/>
   <PropertyGroup>
		<OutDir>$(MSBuildStartupDirectory)\OutDir\</OutDir>
		<SolutionProperties>
					OutDir=$(OutDir);
					Platform=Any CPU;
					Configuration=Release
		</SolutionProperties>
   </PropertyGroup>
	<ItemGroup>
		<Solution Include="..\MsBuildSample.sln">
			<Properties>
							$(SolutionProperties)
			</Properties>
		</Solution>
	</ItemGroup>
	<Target Name="Build">
		<MSBuild Projects="@(Solution)"/>
	</Target>
	<Target Name="RunTests">
		<Exec Command='"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\mstest.exe" /testcontainer:"$(MSBuildStartupDirectory)\OutDir\MsBuildSample.WebApp.Tests.dll" /testcontainer:"$(MSBuildStartupDirectory)\OutDir\AnotherTestProject.dll"' />
	</Target>
	<ItemGroup>
	  <!-- All files from build -->
	  <ZipFiles Include="$(OutDir)_PublishedWebsites\**\*.*" />
  </ItemGroup>
	<Target Name="Zip">
		<Zip Files="@(ZipFiles)"
			 WorkingDirectory="$(OutDir)_PublishedWebsites\" 
			 ZipFileName="$(OutDir)Package.zip"/> 
	</Target>
</Project>
 

Das Item "ZipFiles” umfasst alle Webseiten in meinem "OutDir”. In dem Zip Target zippe ich diese Files und gebe noch an, von welchem Ordner aus gezippt werden soll. Als letztes geb ich noch ein Namen und fertig.

Der Aufruf erfolgt wie in meinen letzten Posts schon über eine .bat Datei:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe Buildsolution.targets /t:Build,RunTests,Zip

Damit hat man recht einfach und effektiv eine Art "Deployment-Package”, auch wenn man mit MSDeploy und anderen Dingen noch viel mehr Voodoo treiben kann. Ein Zip machen, kann nie schaden ;)

[ Download Democode ]


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!