#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. Не думал об этом — Спасибо!