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

- Les pièges de l’installation de Visual Studio 2017 par Blog de Jérémy Jeanson le il y a 5 heures et 9 minutes

- UWP or not UWP sur Visual Studio 2015 ? par Blog de Jérémy Jeanson le 03-08-2017, 19:12

- Désinstallation de .net Core RC1 Update 1 ou SDK de Core 1 Preview 2 par Blog de Jérémy Jeanson le 03-07-2017, 19:29

- Office 365: Ajouter un utilisateur ou groupe dans la liste des Site collection Administrator d’un site SharePoint Online via PowerShell et CSOM par Blog Technique de Romelard Fabrice le 02-24-2017, 18:52

- Office 365: Comment créer une document library qui utilise les ContentTypeHub avec PowerShell et CSOM par Blog Technique de Romelard Fabrice le 02-22-2017, 17:06

- [TFS] Supprimer en masse les dépendances à SQL Enterprise ou Developer avant de procéder à une migration par Blog de Jérémy Jeanson le 02-20-2017, 20:30

- Office 365: Attention au volume utilisé par les fichiers de Thèmes de SharePoint Online par Blog Technique de Romelard Fabrice le 02-07-2017, 18:19

- [SCVMM] Supprimer une machine bloquée par Blog de Jérémy Jeanson le 01-31-2017, 21:22

- Microsoft .Net Challenge 2017 par Le Blog (Vert) d'Arnaud JUND le 01-30-2017, 15:25

- Office 365: Utiliser le bouton Export to Excel depuis un teamsite SharePoint Online et avec le client Office 2007 par Blog Technique de Romelard Fabrice le 01-27-2017, 18:58