Versioning del software (Parte 2)

In questa seconda parte relativa al versioning del software, voglio mostrarvi come gestisco il versioning all’interno dei miei programmi sviluppati in Visual Studio.

Per ogni programma implemento la procedura di versioning indicata in Versioning del software, utilizzando alcuni automatismi per impostare la versione in automatico ad ogni compilazione. All’interno della versione vado ad inserire in automatico anche l’indice della versione dei file gestita nel programma di controllo del codice sorgente, nel mio caso SVN.

Di seguito potete vedere la struttura dei file utilizzata per gestire il versioning all’interno del progetto di esempio “Versioning”.

versioningsolutions

Solutions Items

Nella cartella “Solutions Items” inserisco i file comuni all’intero progetto, e precisamente:

  • Version.xml
  • PreBuild.xml
  • PostBuild.xml
  • SolutionsInfo.cs

In questi file sono inseriti i dati di versione ed i comandi di pre e post compilazione. Ma andiamo ad analizzarne uno per uno:

Version.xml

In questo file inserisco i dati relativi alla versione del programma: Nome, descrizione, major, minor, ecc…

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <BuildFolder>..\Build</BuildFolder>
    <ProductName>Xeneus Versioning</ProductName>
    <ProductDesc>Versioning sample program</ProductDesc>
    <CompanyName>Xeneus - IT Solutions</CompanyName>
    <Copyright>Copyright Xeneus ©2013</Copyright>
    <Trademark>All Rights Reserved</Trademark>
    <Configuration></Configuration>
    <Major>2</Major>       <!-- Major version -->
    <Minor>54</Minor>      <!-- Minor version -->
    <Release>1</Release>   <!-- Release: 0=Not Applicable / 1=Alpha / 2=Beta / 3=Candidate / 4=Release -->
    <Revision>0</Revision> <!-- Revision -->
  </PropertyGroup>
</Project>

Questo file viene poi letto dal programma di compilazione msbuild.exe il quale aggiorna il file “SolutionsInfo.cs”. Ad ogni variazione del numero di versione, è sufficiente modificare i valori in questo file e ad ogni compilazione vengono riportati nei corrispettivi assembly.

PreBuild.xml

In questo file inserisco i task che devono essere eseguiti prima della compilazione del programma. Il file viene interpretato ed eseguito dal programma “msbuild.exe”.

<?xml version="1.0" encoding="utf-8"?>

<Project DefaultTargets="Version" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
  <Import Project="Version.xml" />

  <Target Name="Version">
    <!--Get current date and time-->
    <PropertyGroup>
      <GetBuildScript><![CDATA[ public static string ScriptMain() { return Convert.ToInt32(DateTime.Now.Date.Subtract(new DateTime(2001, 1, 1)).TotalDays).ToString(); } ]]></GetBuildScript>
      <GetRevisionScript><![CDATA[ public static string ScriptMain() { return Convert.ToInt32(DateTime.Now.Subtract(DateTime.Today).TotalMinutes).ToString(); } ]]></GetRevisionScript>
    </PropertyGroup>
    <Script Language="C#" Code="$(GetBuildScript)" Imports="System">
      <Output TaskParameter="ReturnValue" PropertyName="BuildDate" />
    </Script>
    <Script Language="C#" Code="$(GetRevisionScript)" Imports="System">
      <Output TaskParameter="ReturnValue" PropertyName="BuildTime" />
    </Script>

    <!--Get current SVN version-->
    <PropertyGroup>
      <SourceRevision>0</SourceRevision>
    </PropertyGroup>
    <SvnVersion LocalPath="$(MSBuildProjectDirectory)" Condition="Exists('$(ProgramFiles)\subversion\bin\svn.exe')">
      <Output TaskParameter="Revision" PropertyName="SourceRevision" />
    </SvnVersion>

    <!--Set AssemblyInfo file-->
    <AssemblyInfo
      CodeLanguage="CS"
      OutputFile="$(MSBuildProjectDirectory)\SolutionInfo.cs"

      AssemblyDescription="$(ProductDesc)"
      AssemblyConfiguration="$(Configuration)"
      AssemblyCompany="$(CompanyName)"
      AssemblyProduct="$(ProductName)"
      AssemblyCopyright="$(Copyright)"
      AssemblyTrademark="$(Trademark)"
      AssemblyCulture=""

      AssemblyVersion="$(Major).$(Minor).$(Release)$(Revision).$(SourceRevision)"
      AssemblyFileVersion="$(Major).$(Minor).$(BuildDate).$(BuildTime)"
    />

    <Message Text="Version: $(Major).$(Minor).$(Release)$(Revision).$(SourceRevision)"/>
  </Target>
</Project>

La pre-compilazione si occupa di:

  • caricare le variabili inserite nel file “Version.xml”
  • leggere la data e l’ora corrente
  • leggere la versione corrente del progetto salvato in SVN
  • impostare i dati nel file dell’assembly “SolutionInfo.cs” del progetto

PostBuild.xml

In questo file inserisco i task che devono essere eseguiti dopo la compilazione del programma. Il file viene interpretato ed eseguito sempre dal programma “msbuild.exe”.

<?xml version=”1.0″ encoding=”utf-8″?>

<Project DefaultTargets="CopyToBuildFolder" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
  <Import Project="Version.xml" />

  <ItemGroup>
    <MySourceFiles Include="$(MSBuildStartupDirectory)\*.*"/>
  </ItemGroup>

  <Target Name="CopyToBuildFolder">
    <RemoveDir Directories="$(BuildFolder)" />
    <MakeDir Directories="$(BuildFolder)" />
    <Copy SourceFiles="@(MySourceFiles)" DestinationFolder="$(BuildFolder)" />
  </Target>
</Project>

La post-compilazione si occupa di:

  • caricare le variabili inserite nel file “Version.xml”
  • copiare la versione compilata nella cartella “BuildFolder”

SolutionInfo.cs

Questo file viene aggiornato in automatico durante l’esecuzione della pre-compilazione.

using System.Reflection;

[assembly: AssemblyDescription("Versioning sample program")]
[assembly: AssemblyCompany("Xeneus - IT Solutions")]
[assembly: AssemblyProduct("Xeneus Versioning")]
[assembly: AssemblyCopyright("Copyright Xeneus ©2013")]
[assembly: AssemblyTrademark("All Rights Reserved")]
[assembly: AssemblyVersion("2.54.10.0")]
[assembly: AssemblyFileVersion("2.54.4578.883")]

Questo file viene associato come file “linkato” in tutti i progetti presenti nella soluzione, in modo da avere le informazioni comuni dell’assembly su tutti i progetti della soluzione. Aggiungo poi ad ogni progetto della soluzione un proprio file assembly dove indico le proprietà che differenziano da progetto a progetto.

Progetto principale

Nel progetto principale della soluzione, inserisco nelle proprietà di compilazione le seguenti righe:

Pre-compilazione:

%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe $(SolutionDir)Solutions\PreBuild.xml /l:FileLogger,Microsoft.Build.Engine;logfile=Build.log

Post-compilazione:

%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe $(SolutionDir)Solutions\PostBuild.xml /l:FileLogger,Microsoft.Build.Engine;logfile=Build.log

versioningproperty

In questo modo, ogni volta che lancio il comando di compilazione, vendono eseguiti i task inseriti in PreBuild.xml e PostBuild.xml. Alla fine di tutto il processo di compilazione, avrò il mio progetto compilato nella cartella “BuildFolder” specificata in “Version.xml”.

ApplicationVersionInfo.cs

Nel progetto principale, od in ogni progetto in cui mi serva recuperare i dati di versione, inserisco questa classe, la quale serve per recuperare le informazioni di versione dell’applicazione, è una classe statica, pertanto non necessita di dichiarazioni ed è subito utilizzabile in tutte le parti del programma.

Le informazioni di versione rilevate sono elencate nella tabella di seguito riportata:

Proprietà Descrizione Tipo Esempio
AssemblyVersion Versione assembly del prodotto string 2.54.10.0
AssemblyFileVersion Versione assembly del file string 2.54.4578.883
ShortDescription Descrizione breve string 2.54.a0
LongDescription Descrizione lunga string 2.54 (Alpha 0)
ExtendedDescription Descrizione estesa string 2.54 (Alpha 0) [Build: 15/07/2013 14:43])
Major Versione maggiore int 2
Minor Versione minore int 54
Build Numero di build int 10
BuildDate Data di build DateTime 15/07/2013 14:43
Release Tipo di rilascio ReleaseEnum [Alpha, Beta, Candidate, GeneralAvailable, Maintenance] Alpha
Revision Numero di revisione int 0
SourceRevision Indice del sorgente int 0
Title Titolo string Xeneus Versioning – Main
Description Descrizione string Versioning sample program
ProductName Nome del prodotto string Xeneus Versioning
CopyrightHolder Copyright string Copyright Xeneus ©2013
CompanyName Nome della compagnia string Xeneus – IT Solutions
Configuration Tipo di configurazione string

Esempio Versioning

Ho realizzato una soluzione di esempio, dove potete vedere direttamente come gestisco quanto indicato sopra. Lanciando li programma potete notare tutte le informazioni di versioning che è possibile recuperare:

versioningwindow

Potete scaricare la soluzione di esempio tramite il file di seguito riportato:

Versioning del software (Parte 1)

Lascia un commento