Пользовательская задача 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


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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.