2016-03-22 1 views
1

Я строй DSL в Groovy, который должен позволить использовать интерполяцию строки внутри DSL:Как получить доступ к переменным внутри интерполяции строк в Groovy DSL

def dsl = """ 
    def projectName = "test" 
    project("${projectName}/123") { 
     task { 

     } 
    } 
""" 

К сожалению, при использовании следующего кода интерпретировать выше DSL, то Groovy интерпретатор не знает projectName (и дает MissingPropertyException):

class ProjectSpec { 
    def name 

    void task(closure) { 
    } 
} 
binding.project = { name, closure -> 
    def project = new ProjectSpec() 
    project.name = name 
    def code = closure.rehydrate(project, this, this) 
    code.resolveStrategy = Closure.DELEGATE_ONLY 
    code() 
    project 
} 
def shell = new GroovyShell(binding) 
Script script = shell.parse(dsl) 
project = script.run() 
println project.name 

Как я могу добиться этого? Думаю, мне нужно отложить оценку GString. Должен ли я использовать для этого ASTTransformation?

Спасибо,

Майкл

ответ

1

Эта ошибка происходит от того, как вы проверить ваш DSL. Вы используете тройные двойные кавычки для определения своей строки dsl: здесь здесь интерполируется переменная. Если вы прочитаете эту переменную из файла, вы увидите, что ваш код работает.

Определите свою строку dsl с тройной простой цитатой ('''): она должна работать.

Смежные вопросы