Gradle 7 (Groovy 3) - метод в закрытии выполняется/вызывается немедленно

Я обновляю Gradle с 5.6.3 до 7.5.1. У меня есть настраиваемый плагин Gradle, который принимает закрытие. И в build.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 (groovy 2.5), но с gradle 7 (groovy 3) я получаю

Не удалось выполнить задачу «Пользовательская».

Ошибка при оценке свойства myClosure задачи custom. Не удалось найти метод filesMatching() для аргументов [**/my.yaml, build_46x3ac [ email protected] 15088f00] для задачи custom типа com.custom.gradle.plugin. .tasks.ТестТаск.

Любое предложение здесь, чтобы исправить проблему? Спасибо!

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()
  ...
}
Другие вопросы по тегам