Как создать XML-документ со специальными именами узлов с Groovy Markupbuilder - PullRequest
0 голосов
/ 04 ноября 2010

Я создаю муравьиный скрипт с отличной разметкой.К сожалению, markupbuilder не позволяет мне создавать узлы с именем 'target' (нет проблем с targettee), потому что он выбрасывает меня

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], BuildGen$_main_closure1_closure5@18efaea]
Possible solutions: wait(), any(), trim(), split(), dump(), next()

, поэтому внутри моего markupbuilder работает этот фрагмент:

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

но я бы хотел добиться того же с помощью целевого узла.

Мне удалось создать пустой целевой узел следующим образом:

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

но как мне это сделать?пойти и поместить больше узлов внутри этого «целевого» узла?


Пример рабочего кода:

 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
  }
}

1 Ответ

3 голосов
/ 04 ноября 2010

Если я правильно понял, ваша проблема в том, что вы хотите создать узлы с именами, которые являются ключевыми словами Groovy?

Если это так, то вы можете просто поместить имя в кавычки, например так:

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

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

println writer

Этот фрагмент будет распечатан:

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

Для меня это работает:

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()

Установили ли вы target что-либо в своем коде перед вызовом этого?

Вы можете попробовать:

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

Это может работать лучше?

Я пробовал Groovy 1.7.5 и 1.8 beta 2 и не могу заставить его выйти из строя: - /

...