Gradle dependsOn и динамические переменные

#gradle #groovy #build.gradle

#gradle #groovy #build.gradle

Вопрос:

Смотрите следующий сценарий:

 def dynamic = "original value"

task stuffThatHasToBeDoneBefore << {
    doSomething(dynamic)
}

task b (dependsOn: stuffThatHasToBeDoneBefore) {
    dynamic = "value of task b that never will be used by stuffThatHasToBeDoneBefore-task"
}

task c (dependsOn: stuffThatHasToBeDoneBefore) {
    dynamic = "value of task c"
}
  

Я хочу использовать stuffThatHasToBeDoneBefore-task несколько раз при выполнении сборки, чтобы уменьшить дублирование кода.

Прямо сейчас невозможно выполнить задачу b и быть уверенным, что stuffThatHasToBeDoneBefore-task будет выполнен заранее с динамическим значением («значение задачи b, которое никогда не будет использоваться stuffThatHasToBeDoneBefore-task»), потому что значение динамической переменной будет перезаписано задачей c вэтап настройки («значение задачи c»).

Единственный способ, который я вижу, чтобы сделать это, заключается в следующем:

 task b_alternative << {
    dynamic = "value of task b that will be used in stuffThatHasToBeDoneBefore-task now"
    tasks.stuffThatHasToBeDoneBefore.execute()
}
  

К сожалению, это всего лишь обходной путь, и я читал в нескольких источниках, что не рекомендуется использовать tasks.taskname.execute()

Может кто-нибудь сказать мне, как структурировать код, чтобы я мог повторно использовать материал, заданный перед задачей, с динамическими значениями?

Обычно я бы использовал простой метод вместо задачи для него и передавал динамическое значение в качестве аргумента, но это невозможно, потому что stuffThatHasToBeDoneBefore-task — это задача с Zip-типом, которая доступна только как задача, а не как метод.

Ответ №1:

Решение вашей проблемы — использовать пользовательскую задачу. Пользовательская задача может расширить ZipTask, и вы можете определить для нее пользовательское dynamic свойство и doSometing метод, который его использует. Затем вы добавляете doSomething в doFirst или doLast в зависимости от того, когда вы хотите его выполнить (до или после создания zip).

Ваш сценарий сборки становится более выразительным:

 // import MyCustomTask here
task b (type: MyCustomTask) {
   dynamic = "value for task b"
}
task a (type: MyCustomTask) {
   dynamic = "value for task a"
}
  

Обратите внимание, что dynamic это больше не переменная в вашем скрипте сборки, теперь это свойство вашей пользовательской задачи.

Комментарии:

1. Не думал об этом — Спасибо!