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