如何在Grails中覆盖外部配置文件中的配置变量,以便依赖于该变量的变量也会更新?

Bel*_*gor 3 grails groovy config lazy-evaluation

我的grails应用程序中有一个外部和内部配置:

Config.groovy中

root = "/home/baseConf"

test {
    dir =  root + "/testDir"
}
Run Code Online (Sandbox Code Playgroud)

External.groovy

root = "/home/externalConf"
Run Code Online (Sandbox Code Playgroud)

内部控制器我有:

println "${grailsApplication.config.root}"
println "${grailsApplication.config.test.dir}"
Run Code Online (Sandbox Code Playgroud)

什么是印刷品:

/home/externalConf
/home/baseConf/testDir
Run Code Online (Sandbox Code Playgroud)

我想要打印的内容:

/home/externalConf
/home/externalConf/testDir
Run Code Online (Sandbox Code Playgroud)

如何通过在外部配置文件中交换这一个基本变量来更改在Config.groovy中使用一个基本变量的许多变量(如上例所示)?这样的事情甚至可能吗?

can*_*oni 5

你需要改变你的dir变量(内部测试).检查下面的代码.

test {
    dir =  "${-> root}/testDir"
}
Run Code Online (Sandbox Code Playgroud)

此更改是必要的,因为您希望在调用dir时对其进行求值,而不是在加载Config时对其进行求值.这称为后期绑定(懒惰评估)(请参阅Ian Roberts的答案:在Config.groovy中重用Grails变量).

重要的是要注意它与Groovy语言(而不是Grails)有关.

热切评估策略如下:

def x = 1
def s = "The value of x is: ${x}"
println s //The value of x is: 1

x = 2
println s //The value of x is: 1
Run Code Online (Sandbox Code Playgroud)

另一方面,懒惰评估策略将按需评估表达式(按需调用):

def x = 1
def s = "The value of x is: ${-> x}"
println s //The value of x is: 1

x = 2
println s //The value of x is: 2    
Run Code Online (Sandbox Code Playgroud)