如何在 Groovy DSL 中访问字符串插值内的变量

How to access variables inside string interpolation in a Groovy DSL

我正在 Groovy 中构建一个 DSL,它应该允许在 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 吗?

谢谢,

迈克尔

此错误来自您测试 dsl 的方式。您使用三重双引号来定义您的 dsl String :变量在此处插入。如果您从文件中读取此变量,您将看到您的代码有效。

用简单的三引号 (''') 定义您的 dsl 字符串:它应该可以工作。