在声明后更改Jenkins中带@Field注释的变量?

在声明后更改Jenkins中带@Field注释的变量?,jenkins,groovy,scope,annotations,Jenkins,Groovy,Scope,Annotations,我目前正在编写一个Jenkins脚本,该脚本加载另一个Jenkins脚本并尝试将其用作对象。假设我的代码如下所示: 在Jenkins的主要脚本下: node() { a = load ("path/to/file") println("Printing ${a.aVar}") //This prints "a" a.changeAVar("b") println("Printing ${a.aVar}") //This prints "b" println

我目前正在编写一个Jenkins脚本,该脚本加载另一个Jenkins脚本并尝试将其用作对象。假设我的代码如下所示:

在Jenkins的主要脚本下:

node() {
    a = load ("path/to/file")
    println("Printing ${a.aVar}") //This prints "a"
    a.changeAVar("b")
    println("Printing ${a.aVar}") //This prints "b"
    println("Printing ${aVar}") //This should fail
}
在路径/到/文件下:

import groovy.transform.Field
@Field def aVar = "a"

def changeAVar(newAVar){
    //CODE TO CHANGE aVar = newAVar
}

return this
import groovy.transform.Field

@Field def aVar = []

def changeAVar(newAVar){
    aVar.add(newAVar)
}

def changeAVar2(newAVar){
    getMetaClass().setProperty(this, "aVar", newAVar)
}

return this    
不幸的是,我不知道如何在不使aVar成为全球品牌的情况下将aVar更改为newAVar。我尝试了以下方法:

  • aVar=newAVar将aVar转变为全局
  • @Field aVar=newAVar不起作用,因为@Field需要在脚本主体中
  • def aVar=newAVar显然不起作用,因为aVar变成了局部变量
  • 出于某种原因,this.aVar=newAVar也将aVar变成了一个全局变量
  • 即使试图用a.aVar=“b”在脚本之外更改aVar,也只会将其变成一个全局变量
  • (另一方面,如果您将aVar变成一个列表并添加到其中,而不是替换它,则其工作原理与预期一样)

    是否可以在初始化@Field变量后重新分配它们?如果不是,人们通常如何解决这类问题?(我正在考虑将子脚本包装到一个可以初始化的类中,但我觉得这太麻烦了,不值得这么做,而且不够直观)


    谢谢。

    终于礼貌地得到了答案;我非常关注Jenkins是罪魁祸首,所以我从来没有费心在Groovy中尝试这个脚本

    将changeAVar替换为

    getMetaClass().setProperty(this, "aVar", newAVar) 
    
    工作完美

    演示:

    node() {
        a = load ("path/to/file")
        println("Printing ${a.aVar.toString()}") //This prints "[]"
        a.changeAVar("b")
        println("Printing ${a.aVar.toString()}") //This prints "[b]"
        a.changeAVar2("c")
        println("Printing ${a.aVar.toString()}") //This prints "c"
        println("Printing ${aVar}") //This fails
    }
    
    在路径/到/文件中:

    import groovy.transform.Field
    @Field def aVar = "a"
    
    def changeAVar(newAVar){
        //CODE TO CHANGE aVar = newAVar
    }
    
    return this
    
    import groovy.transform.Field
    
    @Field def aVar = []
    
    def changeAVar(newAVar){
        aVar.add(newAVar)
    }
    
    def changeAVar2(newAVar){
        getMetaClass().setProperty(this, "aVar", newAVar)
    }
    
    return this    
    

    你试过“aVar=newAVar”或“this.aVar=newAVar”吗?如果字段转换通过“load”正确处理,您应该能够像传统的实例字段一样从方法访问它;它们都会导致“//这应该失败”行不幸地执行:((您确实可以访问它们,但主脚本也可以访问它们,直觉表明这不应该发生)您可以提供指向“加载”的链接吗方法的文档?我认为它所做的事情与我们对Groovy脚本和
    @Field
    AST转换的直觉相反。