Incrementare automaticamente la versione con Nant e SVN

La mia necessità era quella di automatizzare la version della mia solution.

In particolare volevo gestire manualmente la major e la minor e incrementare automaticamente la build. Inoltre, come quarto elemento della versione volevo inserire automaticamente l'ultima versione del repository SVN.

In rete ho trovato alcuni esempi, molti parziali (che comunque mi sono serviti come esempio), che non facevano a caso mio oppure non funzionavano.

Io ho fatto così:

<target name="getSubversionRevision"> <!-- Incrementa il build number --> <loadtasks assembly="d:/progetti/oss/nant/bin/task/NAnt.Contrib.Tasks.dll" /> <version buildtype="Increment" revisiontype="Increment" path="build.number" /> <!-- Retrieve subversion revision number --> <echo message="Retrieving Subversion revision number"/> <property name="svn.revision" value="0"/> <exec program="svn" commandline='info ${src.dir} --revision HEAD --xml' output="${src.dir}\_revision.xml" failonerror="false"/> <xmlpeek file="${src.dir}\_revision.xml" xpath="/info/entry/commit/@revision" property="svn.revision" failonerror="false"/> <echo message="Using Subversion revision number: ${svn.revision}"/> <!-- Compila il nuovo ApplicationInfo.cs con il nuovo Version Attribute --> <asminfo output="${src}/ApplicationInfo.cs" language="CSharp"> <imports> <import namespace="System" /> <import namespace="System.Reflection" /> </imports> <attributes> <attribute type="AssemblyCompanyAttribute" value ="xxxxxxx" /> <attribute type="AssemblyProductAttribute" value="yyyyy" /> <attribute type="AssemblyCopyrightAttribute" value="zzzzzz" /> <attribute type="AssemblyTrademarkAttribute" value="vvvvv" /> <attribute type="AssemblyCultureAttribute" value="" /> <attribute type="AssemblyVersionAttribute" value="${buildnumber.major}.${buildnumber.minor}.${buildnumber.build}.${svn.revision}" /> </attributes> </asminfo> </target>

E' necessario scaricare NantContrib e copiare (come dice il readme) il contenuto della cartella bin di NantContrib nella cartella bin/task di Nant.

Inoltre è necessario creare un file di nome build.number nella home del progetto. Il contenuto del file deve essere la versione di partenza, di solito 0.0.0.0 oppure il numero di versione a cui siete adesso.

Per poter compilare tutti i progetti della solution con la stessa versione ho condiviso fra tutti i progetti il file ApplicationInfo.cs, che contiene anche gli attributi comuni a tutte le assembly. Questo file viene creato dallo script Nant.

Ovviamente questo task parte prima della compilazione vera e propria.