Build Automation (NAnt + MSBuild)
NAnt merupakan build automation tools yang open source dan merupakan porting dari java. NAnt dapat di download di NAnt Homepage. Saya biasanya menggunakan NAnt standalone sebagai automation tools. Sehingga IDE Build pada Visual Studio tidak ada fungsinya lagi sama sekali. VS (Visual Studio) hanya sebagai text editor saja dengan kekuatan Intellisense nya. Sayang sekali ya.. Padahal di VS juga kita menambahkan reference terhadap library dan dependency. Di NAnt juga kita melakukan hal yang sama secara manual sehingga ada pekerjaan yang redundant dan membosankan.
Seringkali juga saya menambahkan reference terhadap library di Visual Studio tetapi lupa menambahkannya di NAnt build file. Akhirnya compilasi pun failed. Memang masalah itu sangat mudah diatasi tetapi tetap saja ada duplikasi pekerjaan.
Akhirnya permasalahaan tersebut sedikit memiliki jalan keluar. Ternyata dibalik Build VS tersebut merupakan pekerjaan dari MSBuild. MSBuild mengeksekusi file csproj yang ada pada project kita. File tersebut berisikan XML file yg hampir sama tujuannya dengan file NAnt. Reference tersebut juga telah di definisikan di sana.
... <ItemGroup> <Reference Include="antlr.runtime, Version=2.7.6.2, Culture=neutral, PublicKeyToken=65e474d141e25e07, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> <HintPath>..\..\external-bin\nomerge\antlr.runtime.dll</HintPath> </Reference> <Reference Include="Antlr3.Runtime, Version=3.1.0.39271, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> <HintPath>..\..\external-bin\nomerge\Antlr3.Runtime.dll</HintPath> </Reference> <Reference Include="Common.Logging, Version=1.2.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e"> <SpecificVersion>False</SpecificVersion> <HintPath>..\..\external-bin\nomerge\Common.Logging.dll</HintPath> </Reference> ..... <ItemGroup> <ProjectReference Include="..\Messages\Messages.csproj"> <Project>{20F613ED-C871-477C-B1E4-48B96CACF794}</Project> <Name>Messages</Name> </ProjectReference> </ItemGroup> ...
Saya kemudian mendapatkan contoh yang sangat baik untuk memanfaatkan MSBuild dengan NAnt. Contoh tersebut saya dapat dari NServiceBus. Untuk build automation nya NServiceBus mengkombinasikan NAnt dan MSBuild. Silahkan download source code NServiceBus dan pada
folder trunk anda akan menemukan file nant.build. File ini merupakan build file untuk NAnt.
Saya mengambil sebagian code tersebut untuk menghasilkan code NAnt berikut.
<project name="NServiceBus.WithAutoInjection.DDDD" default="compile" xmlns="http://nant.sf.net/release/0.86-beta1/nant.xsd"> <property name="project.config" value="release"/> <property name="solution.dir" value="."/> <property name="build.base" value="build"/> <property name="build.dir" value="${path::get-full-path(build.base)}" /> <!-- build diarahkan absolute terhadap solution dir --> <target name="clean" description="remove all build products"> <delete dir="${build.dir}" if="${directory::exists(build.dir)}" /> </target> <target name="init" depends="clean"> <mkdir dir="${build.dir}" unless="${directory::exists(build.dir)}"/> </target> <target name="compile" depends="init"> <exec program="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe" commandline="/p:Configuration=${project.config} /p:OutDir=${build.dir}/" workingdir="${solution.dir}\Server" /> </target> </project>
struktur direktori yang digunakankan adalah sebagai berikut
Amati target compile.
program="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe"
argument ini digunakan untuk mengeksekusi msbuild.exe pada .NET Framework
/p:OutDir=${build.dir}/"
Digunakan untuk menentukan lokasi output dari eksekusi msbuild. Gunakan alamat absolute.
workingdir="${solution.dir}\Server"
Line ini memberitahukan MSBuild direktori dimana csproj berada. Dan MSBuild akan mengeksekusi file tersebut.
Demikian langkah2 kombinasi NAnt+MSBuild.
jadi msbuild untuk compile, untuk running unit test, test komponent, test lain-lain, running script, tetep lewat NAnt?
ok, kita buat untuk next project.