2010-11-04 3 views
0

Je construis un script ant avec groovy markupbuilder. Malheureusement MarkupBuilder ne me permet pas de créer des noeuds avec 'cible' nom (pas de problème avec targetee), becauase il me jettecomment créer un document xml avec des noms de noeuds spéciaux avec groovy markupbuilder

Caught: groovy.lang.MissingMethodException: No signature of method: java.lang.String.call() is applicable for argument types: (java.util.LinkedHashMap, BuildGen$_main_closure1_closure5) values: [[name:clean], [email protected]] 
Possible solutions: wait(), any(), trim(), split(), dump(), next() 

donc dans mon MarkupBuilder cet extrait fonctionne:

targete(name: 'clean') { 
    delete(dir: rootProj.compilerOutput) 
} 

mais Je voudrais obtenir la même chose avec un nœud « cible » ..

j'ai réussi à créer un noeud « cible » vide de cette façon:

builder.invokeMethod('target', [name: 'clean']) 

mais comment puis-je continuer et mettre plus de nœuds à l'intérieur de ce nœud 'cible'?


Exemple de code de travail:

def writer = new StringWriter() 
def builder = new groovy.xml.MarkupBuilder(writer) 

builder.project(name: projectName, basedir:'.') { 

    // works with 'target2' but not with 'target' 

    'target2'(name: 'build-subprojects') { 
    rootProj.getAllDependentProjects().each { p-> 
    echo(message: "Compiling project: ${p.projectName}") 
    // some real stuff 
    } 
} 
+0

Pouvez-vous envoyer quelques exemples de code qui ne fonctionne pas pour vous? Je ne suis pas sûr de comprendre quel est votre problème? –

+0

J'ai ajouté cela dans la question. J'espère que cela rend mon problème clair :-) – jabal

Répondre

2

Si je pense bien, votre problème est que vous voulez créer des noeuds avec des noms qui sont des mots-clés Groovy?

Si oui, alors vous pouvez simplement mettre le nom entre guillemets, comme ceci:

def writer = new StringWriter() 
def builder = new groovy.xml.MarkupBuilder(writer) 

builder.project { 
    'for'(name: 'clean') { 
    delete(dir: '.') 
    } 
} 

println writer 

Cet extrait de code va afficher:

<project> 
    <for name='clean'> 
    <delete dir='.' /> 
    </for> 
</project> 

Pour moi, cela fonctionne:

def projects = [ 'pro_one', 'pro_two' ] 
def writer = new StringWriter() 
def builder = new groovy.xml.MarkupBuilder(writer) 

builder.project(name: 'test', basedir:'.') { 
    'target'(name: 'build-subprojects') { 
    projects.each { p -> 
     echo(message: "Compiling project: ${p}") 
    } 
    } 
} 

println writer.toString() 

Avez-vous target définir n'importe quoi dans votre code avant d'appeler cela?

Vous pouvez essayer:

builder.target(name: 'build-subprojects') { 

qui pourraient mieux fonctionner?

J'ai essayé Groovy 1.7.5 et 1.8 bêta 2 et ne peut pas l'obtenir à l'échec: -/

+0

salut! oui, cela fonctionne avec des noms de nœuds comme 'for', mais avec 'target' ce n'est pas le cas. Je ne sais pas ce qui est spécial à propos de la 'cible' .. :-( – jabal

+0

Ajouté à ma réponse ... Peut-être que j'essaie d'imprimer 'target' avant que le générateur ne tourne? Aussi, quelle version de Groovy utilisez-vous? –

+1

Oh, votre question "Avez-vous des cibles dans votre code avant d'appeler ceci?" a révélé tout: J'avais une variable nommée ainsi ailleurs, qui a causé le problème, même quand j'ai mis le mot entre apostrophes..builder.target (. .) travaillé! merci! – jabal

Questions connexes