Gradle 7 (Groovy 3) - 闭包中的方法立即执行/调用

Gradle 7 (Groovy 3) - method in a closure executed/called immediately

提问人:MKB 提问时间:12/22/2022 更新时间:9/14/2023 访问量:120

问:

我正在将 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()。

这里有任何建议来解决这个问题吗?谢谢!

gradle 闭包 gradle-plugin groovy-3.0

评论

1赞 daggett 12/22/2022
听起来你弄错了delegate
0赞 daggett 12/22/2022
我猜闭合解决策略在版本之间已经改变......docs.groovy-lang.org/latest/html/api/groovy/lang/......
1赞 Renato 12/23/2022
仅供参考,您可能应该使用添加任务的新方法,例如 .这可能对您没有多大帮助,但它可能会使您的配置阶段更快。tasks.register('name', MyCustomTask) { ... }
0赞 MKB 12/23/2022
是的,我也尝试过(遇到同样的问题)。感谢分享。
0赞 MKB 12/23/2022
如何解决委托问题?任何建议。

答:

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()
  ...
}