Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Generare assembly Strongly Typed

Gestire il versioning spezzando il file assemblyinfo.cs ed inserendo una apposita opzione di compilazione
Gestire il versioning spezzando il file assemblyinfo.cs ed inserendo una apposita opzione di compilazione
Link copiato negli appunti

L'operazione di sign dell'assembly viene svolta durante la compilazione dai task compile-dll e compile-winform, che rispettivamente generano una dll oppure un progetto winform. Il primo passo è quindi quello di creare proprietà che rappresentino opzioni di compilazione, ad esempio per il sign dell'assembly si usa l'opzione di compilazione /keyfile.

<property name="build.csc.keyfile" 
          value='/keyfile:"${project.keyfile}"' /> 

In questo modo la proprietà build.csc.keyfile contiene l'opzione desiderata. A questo punto è necessario modificare il task <csc> includendo questo argomento nella proprietà <arg> in cui vanno inseriti tutti gli argomenti di compilazione.

<arg line="${build.csc.keyfile}" 
     if="${project.option.signassembly}" />

La particolarità di questa opzione è la possibilità di inserire una condizione tramite attributo if, in questo modo l'opzione /keyfile viene inserita solamente se è vera la proprietà project.option.signassembly ed è quindi possibile decidere per ogni singolo progetto se effettuare o meno l'operazione di sign.

Quanto visto fino ad ora è un modo di procedere abbastanza comune in Nant, ovvero impostare tutte le proprietà con l'opzione overwrite="false" nel file common.build, in modo da lasciare la possibilità ai file default.build dei singoli progetti di sostituire i valori di default.

Gestire il file assemblyinfo.cs

In C# il numero di versione, assieme ad altre informazioni sull'assembly, viene di default inserito nel file /properties/assemblyinfo.cs. A tutti gli effetti infatti tutte queste proprietà sono impostate tramite attributi a livello di assembly, che sono interpretati dal compilatore durante la compilazione. Affinché lo script di build sia in grado di modificare queste informazioni, l'unico modo è quindi quello di modificare tale file. Il primo passo è creare una serie di proprietà in cui inserire tutti i valori desiderati.

<target name="build.assembly.setproperties" depends="build.common.init">

  <property overwrite="false" name="assembly.is-cls-compliant" value="true" />
  <property overwrite="false" name="assembly.is-com-visible" value="false" />
  <property overwrite="false" name="assembly.guid" value="" />
  <property overwrite="false" name="assembly.allow-partially-trusted-callers" value="false" />
  <property overwrite="false" name="assembly.description" value="" />
  <property overwrite="false" name="assembly.product" value="${project::get-name()}" />
  <property overwrite="false" name="assembly.company" value="HTML.it" dynamic="true" />
  
  <property overwrite="false" name="assembly.title"
            value="${project::get-name()} for ${framework::get-description(framework::get-target-framework())}" />
	
  <property overwrite="false" name="assembly.version" 
            value="${project.version.major}.${project.version.minor}.0.0" />
	
  <property overwrite="false" name="assembly.version.informational"
            value="${project.version.major}.${project.version.minor}.${project.version.build}.${project.version.revision}" />
         
  <property overwrite="false" name="assembly.copyright" value="DotNetMarche - All Rights Reserved" />
</target>

Questo target dipende naturalmente dal build.common.init visto precedentemente, poiché è lì che vengono impostati i quattro numeri di versione del progetto.

Alcune proprietà fanno uso di funzioni interessanti, ad esempio assembly.title viene impostata al nome del progetto grazie alla funzione project:get-name(), a cui viene aggiunta in calce la versione del frame work per cui si sta compilando, grazie alla funzione framework::get-target-framework(), vista in precedenza.

I numeri di versione sono due, il primo è assembly.version che rappresenta il numero di versione dell'assemly, ed infatti gli ultimi due valori sono posti eguali a zero, mentre la proprietà assembly.version.informational viene impostato con tutte e quattro le cifre.

Ora che tutte le proprietà del progetto sono state impostate si può invocare il task build.assembly.generateassemblyinfo che rigenera da zero il file assemblyinfo.cs sovrascrivendo quello esistente. Anche per questa operazione nant ha un task apposito, chiamato <asminfo> il cui scopo è proprio quello di generare il file di informazioni sull'assembly in vari linguaggi.

<asminfo output="${assemblyinfo.cs}" language="CSharp" failonerror="false">

Questo particolare task contiene solo due serie di elementi, una serie di direttive imports per generare le direttive di importazione, seguite dalla lista degli attributi da generare.

Attenzione alla prima compilazione

È doveroso precisare un concetto molto importante: qualsiasi tool si utilizzi per la gestione del codice, i file assemblyinfo.cs dei vari progetti non debbono essere inclusi tra i sorgenti del progetto.

In caso contrario, ogni volta che si esegue lo script di build, il file assemblyinfo.cs potrebbe risultare modificato richiedendo quindi un nuovo checkin. Questa condizione genera un piccolo inconveniente, al primo checkout del progetto è sempre necessario eseguire una prima compilazione con nant per generare tutti i file assemblyinfo.cs dei vari progetti. Questa condizione deve chiaramente essere scritta nel readme.txt o in un file equivalente, altrimenti al primo checkout, aprendo i progetti in Visual Studio, tutti i file assemblyinfo.cs risulteranno mancanti.

Ti consigliamo anche