gpt4 book ai didi

groovy - 传递 Map 和使用 `body.resolveStrategy = Closure.DELEGATE_FIRST` 有什么区别

转载 作者:行者123 更新时间:2023-12-03 23:13:24 31 4
gpt4 key购买 nike

这两个封装管道的例子得到他们的pipelineParams两种不同的方法,但是为什么一种比另一种更可取还不清楚。

使用的后果是什么

def call(body) {
// evaluate the body block, and collect configuration into the object
def pipelineParams= [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = pipelineParams
body()

pipeline {
echo pipelineParams.name
}
}

对比使用
def call(Map pipelineParams) {
pipeline {
echo pipelineParams.name
}
}

来自 https://jenkins.io/blog/2017/10/02/pipeline-templates-with-shared-libraries/ 的示例代码

最佳答案

不同之处在于,在第一种情况下,使用管道看起来像声明性配置。这就是所谓的builder strategy在 DSL 方面:

myDeliveryPipeline {
branch = 'master'
scmUrl = 'ssh://git@myScmServer.com/repos/myRepo.git'
...
}

而在第二种情况下,应用管道看起来像命令式代码,即它是一个常规函数调用:
myDeliveryPipeline(branch: 'master', scmUrl: 'ssh://git@myScmServer.com/repos/myRepo.git', ...)

the official Jenkins doc中也有说明:

There is also a “builder pattern” trick using Groovy’s Closure.DELEGATE_FIRST, which permits Jenkinsfile to look slightly more like a configuration file than a program, but this is more complex and error-prone and is not recommended.



就个人而言,我不能说我不推荐 DSL 方法。该文档不建议这样做,因为它有点复杂并且容易出错

关于groovy - 传递 Map 和使用 `body.resolveStrategy = Closure.DELEGATE_FIRST` 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55191903/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com