在声明后更改Jenkins中带@Field注释的变量?
我目前正在编写一个Jenkins脚本,该脚本加载另一个Jenkins脚本并尝试将其用作对象。假设我的代码如下所示: 在Jenkins的主要脚本下:在声明后更改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
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。我尝试了以下方法:
谢谢。终于礼貌地得到了答案;我非常关注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转换的直觉相反。