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

- [VS2015] Résoudre les problèmes d’installation de fonctionnalités manquantes par Blog de Jérémy Jeanson le il y a 16 heures et 43 minutes

- IIS : Supprimer les HTTP Headers techniques via PowerShell par Blog Technique de Romelard Fabrice le 02-04-2016, 13:37

- Périphérique Windows to Go en environnements virtuel (4/4 BitLocker) par Blog de Jérémy Jeanson le 01-31-2016, 09:51

- Fonctionnel contre technique ? par Blog de Jérémy Jeanson le 01-30-2016, 11:28

- Vous avez aimé yOS ? Vous allez adorer la Communauté aOS ! par Le blog de Patrick [MVP Office 365] le 01-27-2016, 16:12

- Cortana et Band 2 en Français par Blog de Jérémy Jeanson le 01-23-2016, 12:23

- Upgrader vers Windows 10 et Visual Studio 2015 ? Moi ? Jamais ! par Blog de Jérémy Jeanson le 01-23-2016, 08:27

- [ #Collab365 Summit ] la piste française ! par Le blog de Patrick [MVP Office 365] le 01-17-2016, 19:09

- Comment rater un projet? par Blog de Jérémy Jeanson le 12-24-2015, 13:03

- Besoin de tester un site sur IE ? par Blog de Jérémy Jeanson le 12-24-2015, 12:58