Спеціальне завдання 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робить.


Чи можна було б таким чином виконувати завдання виключно?
Ніклас

17
Я розумію цю помилкуCannot invoke method mustRunAfter() on null object
Ніклас

1
ще одне, ваше завдання cleanBuildPublish має бути розміщене після всіх 3 залежних завдань у вашому сценарії збірки
Станіслав

1
Обов’язково поставте cleanBuildPublishпісля після того, як були визначені всі окремі завдання. Здається, градаційні завдання читаються зверху вниз. Це вирішило мою проблему дляCannot invoke method mustRunAfter() on null object
baskInEminence

2
Важливо зазначити, що gradle не чекає завершення завдання
MontrealDev,

96

Ви також можете використовувати базовий клас завдань, який називається GradleBuild

Ось як ви можете це зробити за допомогою GradleBuild

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

1
отже, завдання буде виконуватися в зазначеній послідовності?
Мангеш Кадам

1
Kotlin його версія?
Мані

Версія Kotlin була б дуже схожою. Ви просто хочете використовувати його project.tasks.registerдля створення свого завдання і все.
tasomaniac

8
Проект Gradle спеціально рекомендує не робити цього: docs.gradle.org/current/userguide/…
Олексій

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
Ніклас

Будь ласка, поділіться своїм файлом build.gradle
Сантош Гокак,

Проект: pastebin.com/4uN9Usvd Календарний модуль: pastebin.com/CPzYKNqx Publishing.gradle pastebin.com/XMMQUG4C
Ніклас


0

Ось як я це зробив, використовуючи сценарії Kotlin, використовуючи і dependOn, і mustRunAfter. Ось приклад запуску двох завдань, одне (спеціально зареєстроване завдання "importUnicodeFiles"), яке знаходиться у проекті "this", і одне (заздалегідь визначене завдання "run"), яке знаходиться у проекті односекційного проекту з назвою ": 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, використовуючи і dependOn, і mustRunAfter. Ось приклад запуску двох завдань, одне (спеціально зареєстроване завдання "importUnicodeFiles"), яке знаходиться у проекті "this", і одне (заздалегідь визначене завдання "run"), яке знаходиться у проекті односекційного проекту з назвою ": 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.