我有我的自定义DSL,它看起来像这样:
topElement {
first {
name "${nameProperty}"
address "${addressProperty}"
}
second {
something "something"
}
}
问题与属性有关,例如${nameProperty}
。
我有我的主班,并且正在像这样加载脚本:
Script dslScript = new GroovyShell().parse(dsl.text)
dslScript.setProperty("nameProperty", "value")
dslScript.setProperty("addressProperty", "addressValue")
ExpandoMetaClass emc = new ExpandoMetaClass(dslScript.class, false)
emc.initialize()
dslScript.metaClass = emc
dslScript.run()
之前,我在DSL中的每个闭包均为DELEGATE_FIRST
,并且属性正常工作。我将所有内容都更改为DELEGATE_ONLY
(希望避免有人嵌套firsts
10次的情况),并且属性停止工作(No such property nameProperty for class FirstElementDelegate
)。
我认为我只会做closure.setProperty("nameProperty", "value")
,但这是行不通的。我尝试了closure.properties.put(...)
和其他许多操作,但似乎没有任何效果。
有什么方法可以向脚本添加属性,以便它们可以在脚本的每个部分工作,而不管上下文如何?
可行但丑陋的解决方案(只是为了说明我想要的):dsl.text.replace('${nameProperty}', 'value')