Om man har en automatiserad byggprocess i TFS och vill att versionen på alla assemblies ska uppdateras automatiskt för varje bygge kan man ta hjälp av MSBuild Community Tasks som har många bra tasks för MSBuild. I mitt exempel så tar jag och lägger in Build numret som ÅÅMM och sen tar jag changeset numret från TFSen. På så sätt är det lätt att spåra tillbaks en specifik release till en kodbas. Vill man ändra Major och Minor versionen är det bara gå in och göra det i byggscriptet.
För att lägga in versionshanteringen i byggprocessen går man in i projektfilen och lägger till:
<Import Project="..\MsBuildTasks\SetVersion.targets" />
Pathen ska förstårs vara till den plats där man skapar SetVersion.targets filen i förhållande till projektet.
Har man flera projekt lägger man till referensen i alla projektfilerna som man vill ha versionen uppdaterad på. I den katalogen där man har SetVersion.targets filen behöver man även lägga in MSBuild.Community.Tasks.dll. Man får lägga till en fil som heter AssemblyVersion.cs i projekten man vill ha versionen också. Den populeras automatisk av bygget men måste vara med i projektet för att den ska komma med i kompileringen.
<Project InitialTargets="SetVersion" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <UsingTask AssemblyFile="MSBuild.Community.Tasks.dll" TaskName="MSBuild.Community.Tasks.AssemblyInfo" /> <UsingTask AssemblyFile="MSBuild.Community.Tasks.dll" TaskName="MSBuild.Community.Tasks.Tfs.TfsVersion" />
<PropertyGroup>
<Major>1</Major>
<Minor>0</Minor>
<Build>0</Build>
<Revision>0</Revision>
</PropertyGroup>
<Target Name="SetVersion" Condition="'$(IsDesktopBuild)'=='false'">
<TfsVersion LocalPath="$(SolutionDir)" TfsLibraryLocation="$(SolutionDir)\Dependencies">
<Output TaskParameter="Changeset" PropertyName="Revision"/>
</TfsVersion>
<Time Format="yyMM">
<Output TaskParameter="FormattedTime" PropertyName="Build" />
</Time>
<Message Text="%0a%0dMaking files writeable" />
<Exec Command="attrib Properties\AssemblyVersion.cs -R" />
<AssemblyInfo CodeLanguage="CS" OutputFile="Properties\AssemblyVersion.cs"
AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)"
AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)"
Condition="$(Revision) != '0'" />
<Message Text="%0a%0dMaking files readonly" />
<Exec Command="attrib Properties\AssemblyVersion.cs +R" />
</Target>
</Project>
När byggservern bygger projekten så kommer den sätta variabeln $(IsDesktopBuild) till false. Lägger man inte in det conditionet kommer versionen uppdateras varje gång och det finns ingen anledning att göra det när man bygger på klienten. Skulle man jobba offline och inte ha tillgång till TFSen när man bygger får man ett exception. På det här sättet kan man bygga offline men när byggservern gör bygget så läggs versionnumret in.