有人来解释groovy Close/Jenkins的魔力吗
我想了解我的Jenkins管道中基于groovy DSL和闭包的部分代码 我有一个Jenkins文件,如下所示:有人来解释groovy Close/Jenkins的魔力吗,jenkins,groovy,Jenkins,Groovy,我想了解我的Jenkins管道中基于groovy DSL和闭包的部分代码 我有一个Jenkins文件,如下所示: foo { var1 = "foo value 1" var2 = "foo value 2" } 我在Jenkins的共享库中有一个groovy脚本(vars目录中的foo.groovy): def call(body) { def config = [:] body.resolveStrategy = Closure.DELEGATE_FIRST bo
foo {
var1 = "foo value 1"
var2 = "foo value 2"
}
我在Jenkins的共享库中有一个groovy脚本(vars目录中的foo.groovy):
def call(body) {
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
body()
println config.var1 // display foo value 1 : for me the magic is here !!
}
我想了解groovy/jenkins机制,即当调用闭包时,映射配置是用变量var1和var2设置的
我(几乎)了解闭包机制和委托方法,但是我们怎么知道将config映射到闭包的delegate字段的矫揉造作允许使用我的文件中声明的变量构造映射呢
我希望我的问题很清楚!:)
问候,
Stef当一个属性在闭包中被引用,而该引用无法在闭包中解析时,会尝试在不同的“位置”解析它
此
委托
属性,可以重新分配该属性所有者
var1
和var2
是无法在闭包中解析的引用的示例
下面将闭包的委托分配给config
,并确保这是用于解析未解析引用的第一个“位置”
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
因此,当我们在闭包中设置属性var1
和var2
时,它们将根据config
进行解析,即设置为该映射的键值对
如果您的示例更改为:
foo {
def var3 = "some value"
var1 = "foo value 1"
var2 = "foo value 2"
var3 = "some value"
}
var3
不会通过config
解析,因为它可以在闭包中解析
更新
在回答您的评论时,我想您会问:为什么将闭包的委托设置为映射会导致将键值对添加到该映射
当var1=“foo value 1”
无法在闭包内解析时,它将根据映射解析,因为
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
所以这实际上意味着我们正在打电话
config.var1 = "foo value 1"
这是一个非常好的缩写
config.put("var1", "foo value 1")
如果您将代码更改为直接调用put
方法,可能更容易理解,例如
def foo = {
put('var1', "foo value 1")
}
def call(body) {
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
body()
println config.var1 // display foo value 1 : for me the magic is here !!
}
call(foo)
如果在Groovy控制台中运行此代码,您将看到它还打印“foo value 1”
如果您仍在努力,也许会有所帮助。谢谢您的回复,但我仍然不明白我是如何知道一个do将映射对象分配给我的闭包的委托字段的,groovy中使用我的闭包中声明的字段构造映射的mecanisme是什么(例如,如果我将一个字符串对象指定给委托字段,我认为这将不起作用)?