Пользовательская задача Gradle, которая выполняет несколько задач

81

Я хочу запускать несколько задач Gradle как одну. Так что вместо

./gradlew clean build publish

Я хочу иметь индивидуальную задачу

./gradlew cleanBuildPublish

что выполняется clean buildи publishпо порядку.

Как такое возможно?

Это не работает

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
}
Никлас
источник
Вы используете плагин java?
Сантош Гокак
@SantoshGokak, да, знаю
Никлас

Ответы:

113

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

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
    tasks.findByName('build').mustRunAfter 'clean'
    tasks.findByName('publish').mustRunAfter 'build'
}

dependsOnне определяет порядок выполнения задач, а просто делает одну задачу зависимой от другой, а mustRunAfterделает.

Станислав
источник
Можно ли было бы при этом выполнять задачи в одиночку?
Niklas
17
Я получаю эту ошибкуCannot invoke method mustRunAfter() on null object
Niklas
1
еще одно: ваша задача cleanBuildPublish должна быть размещена после всех трех зависимых задач в вашем скрипте сборки
Станислав
1
Обязательно ставьте cleanBuildPublishпосле того, как все отдельные задачи были определены. Кажется, что задачи gradle читаются сверху вниз. Это решило мою проблему дляCannot invoke method mustRunAfter() on null object
basketInEminence
2
Важно отметить, что gradle не дожидается завершения задачи
MontrealDevOne
96

Вы также можете использовать базовый класс задачи под названием GradleBuild

Вот как это можно сделать с GradleBuild

task cleanBuildPublish(type: GradleBuild) {
     tasks = ['clean', 'build', 'publish']
}
тасоман
источник
1
так задача будет выполняться в указанной последовательности?
Mangesh Kadam
1
котлин версия этого?
Mani
Версия Kotlin будет очень похожей. Вы просто хотите использовать его project.tasks.registerдля создания своей задачи, и все.
tasomaniac
8
Проект Gradle особо не рекомендует этого делать: docs.gradle.org/current/userguide/…
Alex
4

Если задача публикации находится в подпроекте с именем subProjectName,

...
tasks.findByPath(':subProjectName:publish').mustRunAfter 'build'
...
Асанка
источник
3

Попробуйте сделать так, чтобы cleanBuildPublish зависела от других задач.

build.gradle

task clean{
    println "lets clean"
}

task build {
    println "lets build"
}

task publish {
    println "lets publish"
}

task cleanBuildPublish{
    println 'lets do all'
}


cleanBuildPublish.dependsOn clean
cleanBuildPublish.dependsOn build
cleanBuildPublish.dependsOn publish

Вывод

$ gradle cleanBuildPublish
lets clean
lets build
lets publish
lets do all
:build UP-TO-DATE
:clean UP-TO-DATE
:publish UP-TO-DATE
:cleanBuildPublish UP-TO-DATE

BUILD SUCCESSFUL

Total time: 2.738 secs

проверьте https://docs.gradle.org/current/userguide/more_about_tasks.html#addDependencyUsingTask для получения более подробной информации.

Сантош Гокак
источник
1
По-прежнему нет. Вывод: pastebin.com/8knNfLEY Задача Gradle pastebin.com/NaHhdRkA
Niklas
Пожалуйста, поделитесь своим файлом build.gradle
Сантош Гокак
Проект: pastebin.com/4uN9Usvd Модуль календаря: pastebin.com/CPzYKNqx Publishing.gradle pastebin.com/XMMQUG4C
Niklas
2

Мой подход

task cleanBuildPublish (type: GradleBuild, dependsOn: ['clean', 'build', 'publish']) { 
}

У меня это работает.

Codev
источник
2
Проект Gradle особо не рекомендует этого делать: docs.gradle.org/current/userguide/…
Alex
0

Вот как я это сделал с помощью скриптов Kotlin, используя как dependsOn, так и mustRunAfter. Вот пример запуска двух задач: одна (пользовательская зарегистрированная задача «importUnicodeFiles»), которая находится в «этом» проекте, и одна (заранее определенная задача «запустить»), которая находится в родственном проекте с именем «: unicode»:

tasks.register("rebuildUnicodeFiles") {
    description = "Force the rebuild of the `./src/main/resources/text` data"
    val make = project(":unicode").tasks["run"]
    val copy = tasks["importUnicodeFiles"]
    dependsOn(make)
    dependsOn(copy)
    copy.mustRunAfter(make)
}

Разработчики Gradle обычно не рекомендуют этот подход (они говорят, что принудительное упорядочивание - это плохо, и что выполнение задач из других проектов - плохо), и работают над способом публикации результатов между проектами; см. https://docs.gradle.org/current/userguide/cross_project_publications.html

cpurdy
источник
-1

Вот как я это сделал с помощью скриптов Kotlin, используя как dependsOn, так и mustRunAfter. Вот пример запуска двух задач: одна (пользовательская зарегистрированная задача «importUnicodeFiles»), которая находится в «этом» проекте, и одна (заранее определенная задача «запустить»), которая находится в родственном проекте с именем «: unicode»:

tasks.register("rebuildUnicodeFiles") {
    description = "Force the rebuild of the `./src/main/resources/text` data"
    val make = project(":unicode").tasks["run"]
    val copy = tasks["importUnicodeFiles"]
    dependsOn(make)
    dependsOn(copy)
    copy.mustRunAfter(make)
}
cpurdy
источник
-3

Попробуйте добавить defaultTasksbuild.gradle. Например, defaultTasks 'clean', 'build', 'publish'

Сумит Пал Сингх
источник