有人来解释groovy Close/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

我想了解我的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
   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是什么(例如,如果我将一个字符串对象指定给委托字段,我认为这将不起作用)?