为什么jenkinsfile以这种方式使用闭包?

red*_*888 10 groovy jenkins jenkins-pipeline

这是编写Jenkins管道代码的命令模式,如下所示:

def call(body) {    
    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config
    body()
}
Run Code Online (Sandbox Code Playgroud)

我不确定如何简单地说这个,但是这个闭包是隐式导入的,可以通过.groovy它所在的文件的文件名来调用.

我称之为:

MyClosure { myarg = 'sdfsdf' }
Run Code Online (Sandbox Code Playgroud)

我不完全确定这是做什么的.它正在做call(body),然后body作为代表分配.所以这意味着我传递的关闭是代表,但不仅仅是主人吗?华?我困惑.

Rob*_*les 11

当它运行时,它正在创建一个空的map(config).然后它告诉closure(body)首先查看委托,通过将其resolveStrategy设置为常量来查找属性Closure.DELEGATE_FIRST.然后它将config地图指定为body对象的委托.

现在,当您执行body()闭包时,变量的范围限定为config地图,所以现在config.myarg = 'sdfsdf'.

现在稍后在代码中,您可以轻松访问值中的映射config.

body所有者,默认情况下是委托.但是当您将委托切换为config,并告诉它首先使用委托时,您将获得变量config的范围.

  • 实际上身体并没有指向一个功能.这是一个闭包的实例. (5认同)