Cor*_*ias 11

这是范围的差异。在Groovy脚本中为无“ def”或其他类型的变量分配值时,它将被添加到脚本的全局变量“绑定”中。这意味着可以从脚本中的所有函数访问它。就像您在脚本顶部定义了变量一样。

如果多个线程正在执行脚本,则可能会出现意外行为。

def a = {
  x = 1
  println x
}
def b = {
  x = 2
  println x
}
new Thread(a).start()
new Thread(b).start()
Run Code Online (Sandbox Code Playgroud)

...可能会产生两个1,两个2或一个混合。

相比之下,使用“ def”会使局部变量:

def a = {
  def x = 1
  println x
}
def b = {
  def x = 2
  println x
}
new Thread(a).start()
new Thread(b).start()
Run Code Online (Sandbox Code Playgroud)

...将始终以任意顺序打印1和2。


Pom*_*m12 5

这是一个很好的问题,但它更像是一个 Groovy 问题。

据我所知,定义一个没有def关键字的变量可以从脚本中工作,但如果您在类方法中则不行。此博客文章中的示例:

class MyTest {
    def testMethod() {
        y = 3
        println y
    }    
}

t = new MyTest()
t.testMethod()
Run Code Online (Sandbox Code Playgroud)

变量t将被定义没有问题,但y定义将引发异常。

这意味着在我们的上下文(Jenkins 管道)中,您始终可以在没有def关键字的情况下定义变量,因为您始终处于脚本上下文中,并且您的变量将绑定到脚本。但是,我认为使用def关键字是一种很好的做法,因为它表明您知道何时实例化变量,并且还可以避免重复变量定义的一些问题(如果您使用def关键字定义它们,至少编译会失败,如果您定义了两次相同的变量)。

最后,来自Groovy 文档

在 Groovy 中使用 def 时,实际的类型持有者是 Object(因此您可以将任何对象分配给用 def 定义的变量,如果声明方法返回 def,则返回任何类型的对象)。

因此,您可能希望具体并指定您正在定义的变量类型。在您的情况下,您可以定义cwd为:

String cwd = pwd()
Run Code Online (Sandbox Code Playgroud)

它会禁止你做这样的事情:

def cwd = pwd()
cwd = 1000     // Valid code

String cwd2 = pwd()
cwd2 = 1000    // Will fail compilation
Run Code Online (Sandbox Code Playgroud)