我目前正在研究一个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
不幸的是,我不知道如何在不使aVar成为全球性的情况下将aVar更改为newAVar。我尝试了以下方法:
(另一方面,如果将aVar变成列表并添加到列表中而不是替换列表,则它会按预期工作)
@Field变量初始化后是否可以重新分配?如果没有,人们通常如何解决此类问题? (我当时正在考虑将子脚本包装到可以初始化的类中,但是我觉得那比它的价值更大,而且不那么直观)
谢谢。
答案 0 :(得分:0)
最后得到modify script variable from a Closure in Groovy的回答;如此专注于詹金斯是罪魁祸首,以至于我从不费力去尝试Groovy中的脚本。
用
替换changeAVargetMetaClass().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 = []
def changeAVar(newAVar){
aVar.add(newAVar)
}
def changeAVar2(newAVar){
getMetaClass().setProperty(this, "aVar", newAVar)
}
return this