我正在尝试添加一个巨大的属性图(不,重构不是纠正我团队糟糕决定的选项)初始化函数。
流程与这个简化示例基本相同:
file1.groovy 有:
def call(Map opts = [:]) {
opts = file2(opts)
// do some stuff with the opts...
}
file2.groovy 有大量令人讨厌的选项默认语句,如下所示:
def call(Map opts = [:]) {
opts.something = opts.something ?: true
opts.something2 = opts.something ?: false
}
我试图在运行时添加几个选项,但出现以下错误:
org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: 6e0ca570-b8b5-4c4b-93bb-e3d5661c1294
java.lang.NoSuchMethodError: 'java.lang.Object[] org.codehaus.groovy.runtime.ArrayUtil.createArray(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object,
“java.lang.Object”只持续了大约 20 行。
我做了一些查找,显然 createArray 函数有 250 个对象的限制。
但是,我的主要问题是(在幕后,我假设)createArray 在描述的流程中是如何被调用的?映射是否会转换为数组以在函数之间传递,这与 CPS 有关吗?
假设不可能重新设计这个糟糕的系统,有没有办法解决这个问题?
我需要在地图上添加 5 个项目,如果我注释掉其中 2 个,它就可以正常工作。
你说得对,这与CPS有关,添加
@NonCPS
即可解决。
@NonCPS
def call(Map opts = [:]) {
opts.something = opts.something ?: true
opts.something2 = opts.something ?: false
}