与Jenkins DSL相比,以下各项有何区别:
def cwd = pwd()和
cwd = pwd()发布于 2016-09-17 20:07:50
这是范围的不同。在Groovy脚本中,当您为一个没有"def“或其他类型的变量赋值时,它会被添加到"binding”中,即脚本的全局变量。这意味着可以从脚本中的所有函数访问它。这很像在脚本的顶部定义了变量。
如果多个线程在脚本上运行,可能会出现意外的行为。
def a = {
x = 1
println x
}
def b = {
x = 2
println x
}
new Thread(a).start()
new Thread(b).start()..。可以产生两个一,两个二,或者一个混合。
相比之下,使用"def“可以生成一个局部变量:
def a = {
def x = 1
println x
}
def b = {
def x = 2
println x
}
new Thread(a).start()
new Thread(b).start()..。将始终以任意顺序打印1和2。
发布于 2016-09-16 20:23:41
这是一个很好的问题,但它更像是一个Groovy问题。
据我所知,定义一个没有def关键字的变量可以在脚本中工作,但如果你在类方法中就不行了。此blog post中的示例:
class MyTest {
def testMethod() {
y = 3
println y
}
}
t = new MyTest()
t.testMethod()变量t的定义没有问题,但y定义将抛出异常。
这意味着在我们的上下文(Jenkins pipeline)中,您始终可以在没有def关键字的情况下定义变量,因为您始终处于脚本上下文中,并且您的变量将被绑定到脚本。然而,我认为使用def关键字是一种很好的实践,因为它表明您知道何时实例化您的变量,而且它还可以避免一些重复变量定义的问题(如果您使用def关键字定义变量,至少如果您两次定义同一个变量,则编译将失败)。
最后,来自Groovy documentation:
在Groovy中使用def时,实际的类型持有者是Object (因此,您可以将任何对象赋给使用def定义的变量,并且如果一个方法被声明为返回def,则返回任何类型的对象)。
因此,您可能希望具体指定您正在定义的变量的类型。在您的示例中,您可以将cwd定义为:
String cwd = pwd()它会禁止你做像这样的事情:
def cwd = pwd()
cwd = 1000 // Valid code
String cwd2 = pwd()
cwd2 = 1000 // Will fail compilationhttps://stackoverflow.com/questions/39514795
复制相似问题