Il secondo miglioramento è nell'uso del task <target> di importanza fondamentale in Nant. Un target infatti non è altro che un gruppo di task da eseguire sequenzialmente, in questo modo si possono raggruppare azioni logicamente correlate.
<target name="build.setup"> <mkdir dir="${path.build}"/> </target>
Il target precedente ad esempio crea la directory in cui compilare il progetto, ma si possono costruire task ben più interessanti.
<target name="project.setup"> <fileset id="project.sourcefile" > <include name="${path.src}/**/*.cs" /> <exclude name="${path.src}/obj/**/*.cs" /> <exclude name="${path.src}/bin/**/*.cs" /> </fileset> <resourcefileset id="project.resourcefile" dynamicprefix="true" > <include name="${path.src}/**/*.resx" /> <exclude name="${path.src}/obj/**/*.resx" /> <exclude name="${path.src}/bin/**/*.resx" /> </resourcefileset> </target>
Il target project.setup
esegue una serie di operazioni preliminari alla compilazione, in questo caso vengono creati dei <fileset>: insiemi di file che possono poi essere usati in punti successivi dello script.
Grazie alle opzioni <include> ed <exclude> è possibile utilizzare wildcard per selezionare gruppi di file, la sintassi prevede anche il doppio asterisco (**
) che indica un qualsiasi numero di sottodirectory.
Il fileset project.sourcefile raggruppa quindi tutti i file con estensione cs
che si trovano all'interno del progetto, ma al di fuori delle cartelle obj
e bin
che non fanno parte del progetto stesso.
Per i file di risorse si utilizza invece un resourcefileset la cui unica differenza è supportare attributi tipici delle risorse; come il dynamicprefix utilizzato per dare alle risorse il prefisso corretto con il nome del progetto.
Per i file di risorse si utilizza invece un resourcefileset
la cui unica differenza è supportare attributi tipici delle risorse; come il dynamicprefix
utilizzato per dare alle risorse il prefisso corretto con il nome del progetto.
Il target di compilazione è ora molto più interessante.
<target name="compile-winform" depends="build.setup, project.setup"> <csc target="winexe" debug="Enable" optimize="false" warnaserror="false" output="${path.build}/${project.name}.exe" doc="${path.build}/${project.name}.xml" rebuild="true"> <resources refid="project.resourcefile" /> <sources refid="project.sourcefile" /> </csc> </target>
L'aspetto fondamentale da sottolineare è l'attributo depends che indica a Nant una dipendenza. Quando Nant arriva ad eseguire questo target, esegue in ordine tutti i target da cui dipende, se non sono già stati precedentemente eseguiti. Per script molto complessi è possibile che le catene di dipendenze siano assai complicate, ma in ogni caso nessun target viene eseguito più di una volta.
Il secondo dato importante è che ora, grazie all'uso dei <fileset>
, il target <csc>
non contiene più nessun riferimento a proprietà specifiche del progetto e può quindi essere riutilizzato. Sempre grazie ai fileset, non è necessario inoltre modificare alcunché quando si aggiungono file sorgenti al progetto stesso.