我目前正在开发一个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
}
在path / to / file下:
import groovy.transform.Field
@Field def aVar = "a"
def changeAVar(newAVar){
//CODE TO CHANGE aVar = newAVar
}
return this
不幸的是,我不知道如何在不使aVar成为全局的情况下将aVar更改为newAVar。我尝试过以下方法:
(另一方面,如果你将aVar变成一个列表并添加到它而不是替换它,它就像预期的那样工作)
是否可以在初始化后重新分配@Field变量?如果没有,人们通常如何解决这类问题? (我正在考虑将子脚本包装在我可以初始化的类中,但我觉得这比它的价值更麻烦,更不直观)
谢谢。
终于得到了modify script variable from a Closure in Groovy的答案;是如此专注于詹金斯是罪魁祸首,我从来没有费心去尝试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
}
在path / to / file中:
import groovy.transform.Field
@Field def aVar = []
def changeAVar(newAVar){
aVar.add(newAVar)
}
def changeAVar2(newAVar){
getMetaClass().setProperty(this, "aVar", newAVar)
}
return this