Jenkins/Groovy:如何 declare/use 在 class 之外的枚举?
Jenkins/Groovy: How to declare/use an enum outside class?
我有一个从共享库 my_lib
:
调用函数 setup()
的 Jenkinsfile
// Jenkinsfile
@Library('my_lib@dev') my_lib
import groovy.json.JsonOutput
pipeline {
agent any
stages {
stage( "1" ) {
steps {
script {
d = my_lib.setup();
}
}
}
}
}
shared-lib 函数尝试将枚举分配给字典元素。
// vars/my_lib.groovy
def setup() {
def d = [:]
d.a = org.foo.Foo.Event.A // ok
d.b = my_enum.getEvent() // ok
d.c = my_enum.Event.A // groovy.lang.MissingPropertyException: No such property: Event for class: my_enum
}
// src/org/foo/Foo.groovy
public class Foo {
enum Event {
A,
B;
}
def Foo() {}
}
my_enum.groovy
声明了一个枚举和一个 getter 函数,returns 这些枚举之一:
// vars/my_enum.groovy
public enum Event {
A,
B;
def Event() {}
}
def getEvent() { return Event.A }
问题:
上面的代码在 my_lib.groovy
at d.c = my_enum.Event.A
中失败,错误为 groovy.lang.MissingPropertyException: No such property: Event for class: my_enum
问题:
为什么分配 my_enum.Event.A
失败?
如何定义和使用“文件范围”枚举?
为什么在 class 范围内的枚举没问题时分配一个范围为 my_enum
的枚举会失败,而且 my_enum
中的一个简单包装函数 returns Event.A
也好吗?
1/ 为什么赋值my_enum.Event.A会失败?
这是一个简单的 groovy 代码,大致对应于您在 jenkins/groovy
中的问题 my_enum.groovy
class MY_ENUM { // <- this class is not accessible for you in jenkins
enum Event {A,B}
def getEvent() { Event } // <- i have changed this func on purpose
}
def my_enum = new MY_ENUM() // <- however my_enum variable is visible for you in jenkins
println MY_ENUM.Event.A // works in plain groovy, but MY_ENUM class is not accessible in jenkins
要访问 java/groovy 中的内部枚举,您必须使用 CLASSNAME.ENUMNAME.KEY
访问器 - link
但是在 jenkins 中您无法访问 MY_ENUM
来执行此操作 MY_ENUM.Event.A
并且当您访问 my_enum.Event.A
- 您试图从 class 的实例而不是 class 本身获取 Event
- 所以,它失败了
2/ 如何定义和使用“file-scoped”枚举?
使用上面 class 中定义的函数 getEvent() 你可以这样做:
my_enum.getEvent().A
或这个 - groovy 将为这个访问器找到 getEvent() 函数
my_enum.event.A
不确定,但尝试这样定义 my_enum.groovy
:
enum Event {A,B}
return Event
那么这应该有效:
my_enum.A
3/ 当 class-scoped 枚举没问题时,为什么分配范围为 my_enum 的枚举会失败
因为 jenkins 中的每个文件都会产生一个 class 的实例,但是 class 本身是不可访问的。
我有一个从共享库 my_lib
:
setup()
的 Jenkinsfile
// Jenkinsfile
@Library('my_lib@dev') my_lib
import groovy.json.JsonOutput
pipeline {
agent any
stages {
stage( "1" ) {
steps {
script {
d = my_lib.setup();
}
}
}
}
}
shared-lib 函数尝试将枚举分配给字典元素。
// vars/my_lib.groovy
def setup() {
def d = [:]
d.a = org.foo.Foo.Event.A // ok
d.b = my_enum.getEvent() // ok
d.c = my_enum.Event.A // groovy.lang.MissingPropertyException: No such property: Event for class: my_enum
}
// src/org/foo/Foo.groovy
public class Foo {
enum Event {
A,
B;
}
def Foo() {}
}
my_enum.groovy
声明了一个枚举和一个 getter 函数,returns 这些枚举之一:
// vars/my_enum.groovy
public enum Event {
A,
B;
def Event() {}
}
def getEvent() { return Event.A }
问题:
上面的代码在 my_lib.groovy
at d.c = my_enum.Event.A
中失败,错误为 groovy.lang.MissingPropertyException: No such property: Event for class: my_enum
问题:
为什么分配 my_enum.Event.A
失败?
如何定义和使用“文件范围”枚举?
为什么在 class 范围内的枚举没问题时分配一个范围为 my_enum
的枚举会失败,而且 my_enum
中的一个简单包装函数 returns Event.A
也好吗?
1/ 为什么赋值my_enum.Event.A会失败?
这是一个简单的 groovy 代码,大致对应于您在 jenkins/groovy
中的问题my_enum.groovy
class MY_ENUM { // <- this class is not accessible for you in jenkins
enum Event {A,B}
def getEvent() { Event } // <- i have changed this func on purpose
}
def my_enum = new MY_ENUM() // <- however my_enum variable is visible for you in jenkins
println MY_ENUM.Event.A // works in plain groovy, but MY_ENUM class is not accessible in jenkins
要访问 java/groovy 中的内部枚举,您必须使用 CLASSNAME.ENUMNAME.KEY
访问器 - link
但是在 jenkins 中您无法访问 MY_ENUM
来执行此操作 MY_ENUM.Event.A
并且当您访问 my_enum.Event.A
- 您试图从 class 的实例而不是 class 本身获取 Event
- 所以,它失败了
2/ 如何定义和使用“file-scoped”枚举?
使用上面 class 中定义的函数 getEvent() 你可以这样做:
my_enum.getEvent().A
或这个 - groovy 将为这个访问器找到 getEvent() 函数
my_enum.event.A
不确定,但尝试这样定义 my_enum.groovy
:
enum Event {A,B}
return Event
那么这应该有效:
my_enum.A
3/ 当 class-scoped 枚举没问题时,为什么分配范围为 my_enum 的枚举会失败
因为 jenkins 中的每个文件都会产生一个 class 的实例,但是 class 本身是不可访问的。