我在 Jenkins 共享库中遇到了一些行为,如果有人可以向我解释这一点,那就太好了:
首要问题
假设我在vars
目录中有一个文件:
// MultiMethod.groovy
def Foo() { ... }
def Bar() { ... }
现在,如果我想使用管道中的这些功能,我所做的是:
// Jenkinsfile
@Library('LibName') _
pipeline {
...
steps {
script {
// Method (1): this will work
def var = new MultiMethod()
var.Foo()
var.Bar()
// Method (2) this will not work
MultiMethod.Foo()
}
}
}
((1)和(2)方法是调用groovy脚本中方法的方法。请不要被“方法”这个词的这两种用法混淆。)
所以它只有在我MultiMethod
用new
操作员实例化它时才有效。
但是,如果我将文件命名为multiMethod
(camelCased) 而不是MultiMethod
,我可以使用方法 (2) 来调用脚本中的方法。有人可以解释这种行为吗?
这似乎工作正常。
第二期
基于上面的例子。如果我有一个名为 的 groovy 文件MultiMethod
,(我们之前看到,如果我用 with 实例化,我可以使用它的方法new
),我似乎无法MultiMethod
在动态加载库时实例化一个对象,如下所示:
// Jenkinsfile
pipeline {
...
steps {
script {
// Method (1): this will not work
library 'LibName'
def var = new MultiMethod()
var.Foo()
var.Bar()
}
}
}
如果我尝试这样做,我会得到:
Running in Durability level: MAX_SURVIVABILITY
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 11: unable to resolve class multiMethod
@ line 11, column 32.
def mult = new multiMethod()
^
1 error
at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:958)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUni
...
编辑
我注意到,如果我这样做:
// Jenkinsfile
pipeline {
...
steps {
script {
library 'LibName'
MultiMethod.Foo()
MultiMethod.Bar()
}
}
}
它确实有效!
最后一个问题
如果可以的话,另一个问题。我注意到人们习惯于写作
return this
在他们的脚本末尾的vars
目录中。有人可以解释它有什么用吗?如果有人能在这个机制如何工作的背景下解释这一点,我会很高兴,比如为什么这些脚本会变成全局变量?
谢谢