提问人:MKB 提问时间:12/22/2022 更新时间:9/14/2023 访问量:120
Gradle 7 (Groovy 3) - 闭包中的方法立即执行/调用
Gradle 7 (Groovy 3) - method in a closure executed/called immediately
问:
我正在将 Gradle 从 5.6.3 更新到 7.5.1。我有一个接受闭包的 gradle 自定义插件。在我的主应用程序的 builg.gradle 中,我调用了该自定义插件的任务并为该闭包分配了值。
主要项目 -
task(type: MyCustomTask, 'custom') {
myClosure = {
filesMatching('**/my.yaml') {
filter { it.replace('${test}', 'TEST') }
}
}
...
}
自定义插件 -
@Input
@Optional
Closure myClosure = { }
private void copyFiles() {
println "--------------------------Copying"
project.copy {
from "${project.projectDir}/src/main/resources"
into "${buildDir}"
final cl = myClosure.clone()
cl.delegate = delegate
cl()
}
}
@TaskAction
def custom() {
...
copyFiles()
...
}
这在 gradle 5(时髦 2.5)上工作正常,但在 gradle 7(时髦 3)中,我得到了
任务“custom”的执行失败。
计算任务“custom”的属性“myClosure”时出错 在 com.custom.gradle.plugin.tasks.TestTask 类型的任务“custom”上找不到参数 [**/my.yaml, build_46x3acd2klzyjg008csx3dlg4$_run_closure1$_closure2$_closure5$_closure6@15088f00] 的方法 filesMatching()。
这里有任何建议来解决这个问题吗?谢谢!
答:
0赞
MKB
9/14/2023
#1
找不到任何解决方案。因此,我添加了以下技巧来解决这个问题 -
主要项目 -
task(type: MyCustomTask, 'custom') {
replaceText('**/my.yaml', '${test}', 'TEST')
...
}
自定义插件 -
@Input
@Optional
Closure myClosure = { }
@Input
@Optional
Map fileArgs = [:]
void replaceText(String a, String b, String c) {
fileArgs = [a: a, b: b, c: c]
}
private void copyFiles() {
project.copy {
from "${project.projectDir}/src/main/resources"
into "${buildDir}"
final cl = myClosure.clone()
cl.delegate = delegate
cl()
if (fileArgs) {
filesMatching(fileArgs.a) {
filter { it.replace(fileArgs.b, fileArgs.c) }
}
}
}
}
@TaskAction
def custom() {
...
copyFiles()
...
}
评论
delegate
tasks.register('name', MyCustomTask) { ... }