2010-07-23 13 views
8

J'essaye de déboguer un macrodef dans Ant. Je n'arrive pas à trouver un moyen d'afficher le contenu d'un paramètre envoyé en tant qu'élément.Ant macrodef: Existe-t-il un moyen d'obtenir le contenu d'un paramètre d'élément?

<project name='debug.macrodef'> 
    <macrodef name='def.to.debug'> 
    <attribute name='attr' /> 
    <element name='elem' /> 
    <sequential> 
     <echo>Sure, the attribute is easy to debug: @{attr}</echo> 
     <echo>The element works only in restricted cases: <elem /> </echo> 
     <!-- This works only if <elem /> doesn't contain anything but a 
      textnode, if there were any elements in there echo would 
      complain it doesn't understand them. --> 
    </sequential> 
    </macrodef> 

    <target name='works'> 
    <def.to.debug attr='contents of attribute'> 
     <elem>contents of elem</elem> 
    </def.to.debug> 
    </target> 

    <target name='does.not.work'> 
    <def.to.debug attr='contents of attribute'> 
     <elem><sub.elem>contents of sub.elem</sub.elem></elem> 
    </def.to.debug> 
    </target> 
</project> 

Exemple exécuté:

$ ant works 
... 
works: 
[echo] Sure, the attribute is easy to debug: contents of attribute 
[echo] The element works only in restricted cases: contents of elem 
... 

$ ant does.not.work 
... 
does.not.work: 
[echo] Sure, the attribute is easy to debug: contents of attribute 

BUILD FAILED 
.../build.xml:21: The following error occurred while executing this line: 
.../build.xml:7: echo doesn't support the nested "sub.elem" element. 
... 

donc je suppose que je dois soit un moyen d'obtenir le contenu du <elem /> dans une propriété en quelque sorte (une mise en œuvre de macrodef étendu pourrait avoir cela), ou je besoin d'un sorte de <element-echo><elem /></element-echo> qui pourrait imprimer n'importe quel arbre XML que vous avez mis à l'intérieur. Est-ce que quelqu'un sait d'une implémentation de l'un ou l'autre? Tout autre moyen imprévu d'obtenir les données est bien entendu également le bienvenu.

Répondre

9

Que diriez-vous de la tâche echoxml?

Dans votre exemple de fichier de construction remplaçant la ligne

<echo>The element works only in restricted cases: <elem /> </echo> 

avec

<echoxml><elem /></echoxml> 

résultats dans

$ ant does.not.work 
... 
does.not.work: 
    [echo] Sure, the attribute is easy to debug: contents of attribute 
<?xml version="1.0" encoding="UTF-8"?> 
<sub.elem>contents of sub.elem</sub.elem> 

Peut-être la déclaration XML n'a pas été cherché bien. Vous pouvez utiliser l'attribut echoxml file pour placer la sortie dans un fichier temporaire, puis lire ce fichier et supprimer la déclaration, ou reformater les informations comme bon vous semble.

modifier

À la réflexion, vous pouvez probablement se rapprocher de ce que vous décrivez, par exemple ce corps séquentiel de votre macrodef

<sequential> 
    <echo>Sure, the attribute is easy to debug: @{attr}</echo> 
    <echoxml file="macro_elem.xml"><elem /></echoxml> 
    <loadfile property="elem" srcFile="macro_elem.xml"> 
    <filterchain> 
     <LineContainsRegexp negate="yes"> 
     <regexp pattern=".xml version=.1.0. encoding=.UTF-8..." /> 
     </LineContainsRegexp> 
    </filterchain> 
    </loadfile> 
    <echo message="${elem}" /> 
</sequential> 

donne

$ ant does.not.work 
... 
does.not.work: 
    [echo] Sure, the attribute is easy to debug: contents of attribute 
    [echo] <sub.elem>contents of sub.elem</sub.elem> 
+0

Le '' élément était exactement ce que je cherchais, merci! – clacke

+0

En bonus, le '' fonctionne même sans le traitement supplémentaire pour ajouter les en-têtes XML (testé sur ant 1.8.4). –