Groovy DSL,使用DELEGATE_ONLY传递属性

时间:2018-11-27 15:26:08

标签: groovy dsl groovydsl

我有我的自定义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')

0 个答案:

没有答案