如何在 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 字符串:它应该可以工作。
我正在 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 字符串:它应该可以工作。