venerdì 1 febbraio 2008

Inserire le informazioni di build in un'applicazione Java

Una funzionalità molto comoda di Ant è quella di poter filtrare i file di testo (ivi inclusi i sorgenti Java) durante il processo di build. Tale filtraggio, ottenuto tramite i datatype FilterSet può essere utilizzato agevolmente per inserire le informazioni di build nel proprio applicativo, ad esempio nel titolo di una finestra o in una finestra di dialogo.

Nell'esempio che riporto di seguito si andrà ad inserire il numero e la data di compilazione in una stringa specifica, contenuta in un file di proprietà. L'utilizzo di un file di proprietà con le stringhe e i messaggi da mostrare all'utente è comodo soprattuto perché consente l'internazionalizzazione. Tuttavia, è possibile filtrare direttamente un file .java che contenga la stringa equivalente.

Si supponga di avere un file di proprietà che contenga, fra le altre, la proprietà che imposta il titolo della finestra principale dell'applicazione:

application.title = My Application @APPLICATION_VERSION@

Come è facile intuire il titolo dell'applicazione è formato da una parte statica e immutabile ("My Application") e da una variabile ("@APPLICATION_VERSION@"), quest'ultima che dovrà essere sostituita a tempo di compilazione con le informazioni di build. In sostanza, una volta terminato il processo di build si avrà qualche cosa di simile a:

application.title = My Application [ build number 637 - 01/01/2008 ]


Per raggiungere lo scopo occorre filtrare con Ant il file di proprietà al momento in cui viene fatto il build. E' buona norma, all'atto di un build, creare uno spazio di build che sia identico (o simile) a quello in cui risiedono i sorgenti. Pertanto, immaginando di avere tale file di proprietà in una directory di configurazione e di volerlo copiare, assieme ad altri file di confifgurazione, nella directory relativa di build, il task da utilizzare è il seguente:


<target name="_copyConfig" depends="_createDirectoryStructure" >

<copy todir="${build.conf.dir}" >
<fileset dir="${src.conf.dir}">
</fileset>

<!-- filter the config files -->
<filterset>
<filter token="APPLICATION_VERSION"
value="[ build number ${build.number} - ${build.timestamp} ]" />
</filterset>

</copy>
</target>



Brevemente quello che avviene è che tutti i file dalla directory di configurazione di origine (${src.conf.dir}) vengono spostati in quella di build (${build.conf.dir}), e nel fare questo i file vengono filtrati dal FIlterSet: ogni file che contiene la stringa @APPLICATION_VERSION@ viene modificato e al posto di quest'ultima si inseriscono le informazioni di build.

Si noti che il task di cui sopra fa riferimento a due variabili: ${build.number} e ${build.timestamp}. Entrambe le variabili devono esistere al momento del filtraggio, e quindi devono essere state definite precedente (all'inizio del file di build o in un task precedente quello corrente). La variabile ${build.number} viene impostata tramite il task buildnumber, mentre quella ${build.timestamp} viene generata tramite il task di timestamp. In sostanza:


<buildnumber/>
<tstamp>
<format property="build.timestamp"
pattern="dd/MM/yyyy"/>
</tstamp>




In conclusione Ant può essere utilizzato in modo molto efficace e flessibile per inserire informazioni di build all'interno della propria applicazione. L'esempio qui riportato ha illustrato il concetto, altre casistiche e casi d'uso più complessi sono ovviamente possibili.

Nessun commento: