2016-03-22 27 views
1

我建立在Groovy一个DSL应该允许使用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字符串与三简单报价('''):它应该工作。