如何从配置文件中打印可用的环境? oigbect ConfigSlurper创建的形式是什么?
我试过
def config2 = new ConfigSlurper().parse(new File('obieeadmincfg.groovy').toURL())
config2.config.environments.each { println ${it} }
and
println prettyPrint(toJson(config2))
and
for ( i in 0 ..config2.config.environments.size()-1)
println config2.config.environments[i]
groovy.config
//Config3.groovy
obieadmin {
//default values
serverurl = "http://default.mycompany.com"
}
environments {
pldev01 {
obieeadmin {
serverurl = 'devgdwobi03.x.com'
}
}
plsbx02 {
obieeadmin {
serverurl = 'devgdwobi03.x.com'
}
}
}
答案 0 :(得分:0)
我担心你不能开箱即用。
但是使用一点Groovy Metaprogramming它是可以实现的。
Groovy配置slurper解析正确的Groovy文件,您可以对GroovyShell
执行相同的操作。您可以捕获对environment
方法的调用,从而提供绑定绑定。在该闭包中,您必须收集所有顶级方法调用(具有相同的methodMissing
)。
为基本脚本提供缺少处理程序的属性和方法,可以抑制运行时错误,并且无需关心其他属性即可执行脚本。
不是最好的路径,但它有效。
package test
import org.codehaus.groovy.control.CompilerConfiguration
class A extends Script {
def propertyMissing(String name) { null }
def propertyMissing(String name, def arg) {}
def methodMissing(String name, def args) {}
@Override Object run() { null }
}
class NameCollector {
def envs = []
def methodMissing(String name, def args) { envs << name }
}
// configure interceptors.
def configuration = new CompilerConfiguration()
configuration.scriptBaseClass = 'test.A'
def nc = new NameCollector()
def environments = { Closure it ->
it.delegate = nc;
it.resolveStrategy = Closure.DELEGATE_ONLY
it()
}
// execute config script
new GroovyShell([environments: environments] as Binding, configuration).evaluate(new File("config.groovy"))
nc.envs // Return, print them.
答案 1 :(得分:0)
不确定这是否将永远有效,但是目前您可以通过覆盖'environments'
条件块的设置来做到这一点,例如:
def config = """environments {
dev {
foo = "bar"
}
prod {
foo = "baz"
}
}"""
def configSlurper = new ConfigSlurper()
configSlurper.registerConditionalBlock('environments', null)
assert configSlurper.parse(config).environments.keySet() == ['dev', 'prod'].toSet()