Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Fathi Bellahcene

.Net m'a tuer!

[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 Sourire ).

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:

image

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:

image

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 :
Posted: mercredi 23 février 2011 22:53 par fathi

Commentaires

JeremyJeanson a dit :

Merci pour l'info, ça fait un bou de temps que je n'avais pas ouvert la documentation de NAnt

# février 24, 2011 10:22

Graveen a dit :

Salut Fathi,

Comment tu positionnes NAnt par rapport à MsBuild + MSBuild Community Tasks en terme de souplesse, de puissance ?

Perso, j'était NAnt, mais je suis passé à MSB + MSB/CT; ca répond trés bien à mes besoins, et j'ai du mal à voir si NAnt va (beaucoup) plus loin ou si c'est juste un outil similaire.

# février 24, 2011 11:19

fathi a dit :

@Jeremy -&gt; de rien! ca sert a ca un blog

@Graveen :

Je ne suis pas un grand spécialiste et mon avis n’est surement pas le meilleur…mais je le donne tout de même.

Je préfere Nant pour les raisons suivantes :

-&gt;Il est plus vieux donc à une plus grande communauté

-&gt;Il est fiable : il est très répendu et perso, je l’ai vu builder des trucs vraiment balèze (des builds de plus de trois heures)

&gt;  Il est plus lisible et a un fonctionnement plus rationnel (une instance de Nant qui lance les tâches et pas MsBuild qui relance MsBuild…)

&gt;  pratiquement tout les outils liées à de l’intégration continue (les contrôleurs de code sources, les outils de tests, de QCM, de documentation…) fournissent en générale des tâches Nant pour les faires fonctionner depuis Nant.

MsBuild a aussi quelques arguments :

&gt; Il est intégré à VS

&gt; La possibilité de faire de l’override de tâche (ca c’est vraiment cool)

&gt; Et depuis 2010 l’utilisation de WF (si je dit pas de bêtise)

&gt; Le parallélisme.

Les points communs :

&gt;  C’est du script basé sur une syntaxe xml

&gt; La possibilité de faire des tâches custom en C#

En bref, je ne pense pas qu’il y a un gros écart entre les deux technos (mais je me trompe peut être). La question qui se pose donc est pourquoi changer pour un truc équivalent ?

# février 24, 2011 22:17
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- L’application des MiniDrones Parrot est aussi disponible pour Windows 8.1 par Blog de Jérémy Jeanson le 10-28-2014, 15:01

- L’application des MiniDrones Parrot est enfin disponible pour Windows Phone par Blog de Jérémy Jeanson le 10-27-2014, 09:49

- Mise à jour Samsung 840 EVO sur core server par Blog de Jérémy Jeanson le 10-27-2014, 05:59

- MVP Award 2014 ;) par Blog de Jérémy Jeanson le 10-27-2014, 05:42

- « Naviguer vers le haut » dans une librairie SharePoint par Blog de Jérémy Jeanson le 10-07-2014, 13:21

- PowerShell: Comment mixer NAGIOS et PowerShell pour le monitoring applicatif par Blog Technique de Romelard Fabrice le 10-07-2014, 11:43

- ReBUILD 2014 : les présentations par Le blog de Patrick [MVP Office 365] le 10-06-2014, 09:15

- II6 Management Compatibility présente dans Windows Server Technical Preview avec IIS8 par Blog de Jérémy Jeanson le 10-05-2014, 17:37

- Soft Restart sur Windows Server Technical Preview par Blog de Jérémy Jeanson le 10-03-2014, 19:43

- Non, le certificat public du CA n’est pas un certificat client !!! par Blog de Jérémy Jeanson le 10-03-2014, 00:08