我遇到以下Groovy脚本/
的问题nestedView("JS Pipelines") {
views {
build_pipelines.each {
def build_pipeline = it
buildPipelineView(build_pipeline.build_name + " JS Pipeline") {
selectedJob(build_pipeline.start_job)
}
}
}
}
根据buildPipelineView
的内容,需要多次调用views
方法,该方法位于build_pipelines
对象(code)上。
当在buildPipelineView
调用中包含对{}
的调用时,该方法将解析为在更高的上下文中定义的另一个buildPipelineView
方法。删除每个块后,方法调用将正确解析。 buildPipelineView
如何在每次通话中正确解决?
答案 0 :(得分:1)
如果有疑问,请存储外部引用,该引用对于闭包是可见的,并在该对象上显式调用此方法:
nestedView("JS Pipelines") {
views {
final outer = it
build_pipelines.each { build_pipeline ->
outer.buildPipelineView(build_pipeline.build_name + " JS Pipeline") {
selectedJob(build_pipeline.start_job)
}
}
}
}
答案 1 :(得分:1)
其实ContextHelper.groovy的job-dsl-plugin已经改变了views
闭包的委托策略,正是views
的方括号。
在你的例子中,只有 build_pipelines
被包裹在 views
闭包中,所以你确实改变了 each
闭包的委托策略,但是 buildPipelineView
闭包仍然保持默认策略.
您可以使用 getDelegate
将委托策略返回给 buildPipelineView
闭包。
nestedView("JS Pipelines") {
views {
build_pipelines.each {
def build_pipeline = it
def d = getDelegate()
d.buildPipelineView(build_pipeline.build_name + " JS Pipeline") {
selectedJob(build_pipeline.start_job)
}
}
}
}
答案 2 :(得分:0)
在嵌套闭包中,每个闭包都有一个owner
,它立即包含闭包。 (请参阅Groovy文档中的Delegation strategy。)对于传递给each
的闭包,其owner
是传递给views
的闭包。
Groovy闭包的默认delegation strategy为Closure.OWNER_FIRST
,这意味着当您访问属性或调用方法而未明确提及接收器[如buildPipelineView(...)
]时,Groovy将尝试访问owner
上的属性/方法,如果没有,它将访问委托上的属性/方法。
直接的解决方案是明确地提供接收器,例如this.buildPipelineView(...)
。