fuzzelogic Solutions

January 13, 2010

msbuild

Filed under: c# — Tags: , — admin @ 3:50 pm

Hey all!
MSBuild is the build tool from Microsoft, and ships with the .net framework. Its got the advantage of having a decent build tool thats available on your dev, build, test and production server. This means that your build machine does not need the IDE installed (or anything else). Its XML based, and works by focusing on a Target which runs Task(s). There’s a bunch of predefined tasks, and its “pluggable”, so you can create tasks to do just about anything you want. Each target has a name, and a depends on targets attribute. The name attribute, well that’s easy enough. The dependsOnTargets attribute is a list of other targets that have to happen first, before “this” target runs its task(s).
Here’s a sample msbuild script. I’ve used this as a start off script for a couple projects.

<Project ToolsVersion="3.5"  DefaultTargets="default_build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <UsingTask TaskName="nUnitTask"   AssemblyFile="..\lib\Fuzzelogic.MsBuild.Tools.nUnit.dll" />
  <PropertyGroup>
   <Configuration>Debug</Configuration>
    <nUnitConsolePath>..\tools\NUnit 2.5\bin\net-2.0</nUnitConsolePath>
    <BuildLogDirectory>build_log</BuildLogDirectory>
  </PropertyGroup>
  <ItemGroup>
    <ProjectFiles Include="..\**\*.csproj" />
    <TestProjects Include=".\..\**\bin\debug\*tests*.dll" />
  </ItemGroup>

  <Target Name="default_build"
              DependsOnTargets= "run_the_unit_tests"/>

  <Target Name="first_clean_up">
    <MSBuild Projects="@(ProjectFiles)" ContinueOnError="false" Targets="Clean"
                  />

    <RemoveDir Directories="$(BuildLogDirectory)"/>
  </Target>

  <Target Name="first_create_directories"
              DependsOnTargets="first_clean_up">

    <MakeDir Directories="$(BuildLogDirectory)"></MakeDir>
  </Target>

  <Target Name="first_build_the_project_files"
              DependsOnTargets="first_create_directories">

    <MSBuild Projects="@(ProjectFiles)" Targets="Rebuild" ContinueOnError="false"
             >

      <Output TaskParameter="TargetOutputs"     ItemName="BuildOutput"/>
    </MSBuild>
  </Target>

  <Target Name="run_the_unit_tests"
              DependsOnTargets="first_build_the_project_files">

    <CreateItem Include="@(TestProjects)" >
      <Output TaskParameter="Include" ItemName="TestAssemblies" />
    </CreateItem>
    <nUnitTask ConsolePath="$(nUnitConsolePath)"
                   TestAssemblies="@(TestAssemblies)"
                   LogFile="$(BuildLogDirectory)\nunit.logfile"/>

  </Target>
</Project>

For the above to work, I use a folder structure as follows…

solution folder structure

solution folder structure

The build folder contains the build file, lib contains all 3rd party dlls, src(source) contains the source projects, tools contains the 3rd party tools used (nunit, etc).
The build folder also contains a batch/short cut to open a command prompt with the VS Tools assigned. Create a batch file (or short cut and in the target property) add   %comspec% /k “”c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat”" x86 .

 

 

 

 

solution folder structure
biuld folder

Unfortunetly, nUnit tasks are not supported out the box. BUT… hey, its easy to get a task to support the nUnit-console. That’s what the
<UsingTask TaskName=”nUnitTask” AssemblyFile=”..\lib\Fuzzelogic.MsBuild.Tools.nUnit.dll” />
line is using (available here.) There’s also the community tasks project, which has a a bunch more (including the nunit task)

Hope that helps!

Thanx
Zak

Powered by WordPress