[Nant] Macrodef la tache indispensable!
J’ai la chance de rebosser sur un sujet qui m’a beaucoup intéressé ces dernières années a savoir l’intégration continue (ou plutôt dans mon cas actuel : de la build tout court
).
Et lorsque l’on compile quelque chose d’un peu plus compliqué qu’un projet “hello word”, l’outil incontournable c’est NAnt. Pas besoin de vous faire un long discours dessus, si vous êtes un peu sensible au sujet, vous connaissez certainement NAnt!
le truc vraiment cool avec NAnt, c’est la facilité avec laquelle on peut ajouter des bouts de script custom dans le language que l’on souhaite, on peu:
- créer un “target” custom directement NAnt,
- créer une “task” en C#,
- créer des fonction en C# directement dans le script ou bien dans une dll écrite en C#.
Ainsi, on a la liberté de choisir le langage le mieux adaptés à ce que l’on souhaite faire. Par exemple:
- les opérations sur les string sont plus simples en C#, on va ainsi écrire des fonctions en C# et les utiliser en NAnt,
- par contre, tout ce qui concerne la manipulation de fichiers est plus simple en NAnt, on va donc privilégier du NAnt.
Mais, il y a tout de même quelque chose qui manque dans NAnt: lorsque vous créer des “target”, vous n’avez pas la possibilité de définir des paramètres (comme pour une méthode) et dans ce cas, vous faites souvent un truc comme ca:
<?xml version="1.0"?>
<project name="NAnt Examples" default="main">
<target name="main">
<loadtasks assembly="D:\nant\sandBox\MacroDef.dll" />
<property name="message" value="Hello" />
<call target="printMsg"/>
<property name="message" value="Word" />
<call target="printMsg"/>
</target>
<target name="printMsg">
<echo message="${message}" />
</target>
</project>
lorsque l’on execute NAnt, on a le résultat suivant:

on définit une variable (message) que l’on utilise dans la target chargé d'effectuer le traitement (un simple print)…bref c’est moche.
MacroDef permet de faire la même chose de manière élégante. On va définir un “macro” qui effectue le même traitement et qui défini un paramètre d’entré à notre taret:
<?xml version="1.0"?>
<project name="NAnt Examples" default="main">
<!--Load macro def asm-->
<loadtasks assembly="D:\nant\sandBox\Macrodef.dll" />
<target name="main">
<macroMsg msg="Hello" />
<macroMsg msg="Word" />
</target>
<macrodef name="macroMsg">
<!--Parameters definition-->
<attributes>
<attribute name="msg"/>
</attributes>
<!--Core-->
<sequential>
<echo message="${msg}" />
</sequential>
</macrodef>
</project>
la macro possède les élements suivants:
- un nom (name) de macro (qui sera utilisé lors de l’appel)
- des paramètres (attributes) , une fois définis, ils sont obligatoires
- un traitement que l’on écris en NAnt à l’intérieur des balises sequential.
les appels sont plus clair et propre (pas d’utilisation de paramètres globaux):
<macroMsg msg="Hello" />
<macroMsg msg="Word" />
Le résultat:

have fun!
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :