0

我想要一个 groovy 配置,它允许我设置一些默认值(即计算值),这些默认值可以被环境选择性地覆盖。以下脚本显示了一个简单的示例。

import static junit.framework.Assert.*

def config = 
"""
base { value = "X" }
calc { value = base.value }

environments {
    overridebase {
        base { value = "1" }
    }
}
"""

// these asserts work
assertEquals("X", new ConfigSlurper().parse(config).base.value)
assertEquals("X", new ConfigSlurper().parse(config).calc.value)
assertEquals("1", new ConfigSlurper("overridebase").parse(config).base.value)

// this assert fails as calc.value remains "X"
assertEquals("1", new ConfigSlurper("overridebase").parse(config).calc.value)

前三个断言有效,因此原始计算值有效,但它似乎解决得太快了,因为即使更改了基数,它仍保持原始计算值。

4

2 回答 2

0

看起来最简单的事情就是手动检查缺失值

import static junit.framework.Assert.*

def configs = 
"""
base { value = "X" }
calc {  }

environments {
    overridebase {
        base { value = "1" }
    }
    overridecalc {
        calc { value = "2" }
    }
}
"""

def config

config = new ConfigSlurper().parse(configs)

assertEquals("X", config.base.value)
assertEquals("X", config.calc.value ?: config.base.value)

config = new ConfigSlurper("overridebase").parse(configs)

assertEquals("1", config.base.value)
assertEquals("1", config.calc.value ?: config.base.value)

config = new ConfigSlurper("overridecalc").parse(configs)

assertEquals("X", config.base.value)
assertEquals("2", config.calc.value ?: config.base.value)
于 2013-05-31T07:35:53.697 回答
0

证明自己错了:

def myConfig = new ConfigSlurper("overridebase").parse(config)
assert "1" == Eval.me("${myConfig.calc.value}", myConfig.base.value, myConfig.calc.value.toString())

你鼓励我不要辜负目的。谢谢你。:)

于 2013-05-30T13:54:42.463 回答