为什么在Jenkinsfile中的DSL闭包中使用`env`或`param`时需要关键字`this`

瓦尔泰克

我有基于“结构化DSL”概念的代码

// vars/buildStuff.groovy
def call(body) {

    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config
    body()

    node {
        assert env
        assert params
        doStuff()
    }
} 

在这段代码中我能访问envparams直接,符合市场预期。

但是在顶层Jenkinsfile

buildStuff {
    someParam=params.SOME_PARAM
    buildId=env.BUILD_ID
}

原因java.lang.NullPointerException: Cannot get property 'SOME_PARAM' on null object我必须通过将其编写为:

buildStuff {
    someParam=this.params.SOME_PARAM
    buildId=this.env.BUILD_ID
}

为什么会这样?根据所有的例子管道的文件,我应该能够访问envparams直接。我究竟做错了什么?

的问题resolveStrategy

def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config

config您提供的解决所有的财产价值或空,因此owner没有查询它。在您的示例中,owner正义是this这就是为什么它起作用。

根据您实际要实现的目标,OWNER_FIRST可能是更好的策略。如果您不能更改此设置,最好使用没有默认属性的数据结构。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在创建数组时需要“ new”关键字?

为什么在重载operator <<时需要friend关键字?

在创建新的对象/类时,闭包可以使用new关键字,例如,区别是什么

为什么需要在Objective-C中使用@property关键字?

为什么在Typescript中需要infer关键字?

为什么在do block中需要let关键字?

为什么对象中需要“this”关键字

在DLL中调用函数时,为什么需要“ ref”关键字?

当涉及向量时,移动闭包的关键字

为什么要在Java中使用`transient`关键字?

为什么在构造函数中使用此关键字

为什么在Vue Project中使用“ get”关键字?

为什么在angular js中使用abstract关键字?

为什么在Python中使用type.Generic时保留cls关键字属性?

为什么在 UPDATE SET 中使用 AND 关键字时 MySQL 不会抛出错误

为什么即使闭包取得值的所有权也不一定总是需要move关键字?

为什么__debug__是关键字时不在关键字列表中?

对闭包中的ref关键字用法感到困惑

为什么在调用函数时使用`go`关键字?

为什么在Java8中使用“默认”关键字

为什么在C ++中的类指针声明中使用'struct'关键字

为什么要在Go中的类型中使用“冗余”关键字“ struct”?

闭包(让关键字)-Javascript

让关键字和闭包?

为什么在Java中不使用const关键字?

为什么我们需要在Angular中使用“ $ event”关键字进行事件绑定?(用于输出)

为什么我需要在此函数中使用return关键字,以便Promise可以正常工作?

使用`move`关键字的闭包如何创建FnMut闭包?

为什么在子类中实现抽象方法时需要在抽象方法前加上 override 关键字?