Gradle benutzerdefinierte Aufgabe, die mehrere Aufgaben ausführt


79

Ich möchte mehrere Gradle-Aufgaben als eine ausführen. Also statt

./gradlew clean build publish

Ich möchte eine benutzerdefinierte Aufgabe haben

./gradlew cleanBuildPublish

das führt clean buildund publishin Ordnung.

Wie ist das möglich?

Das funktioniert nicht

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
}

Verwenden Sie das Java-Plugin?
Santosh Gokak

@ SantoshGokak ja ich tue
Niklas

Antworten:


110

Wenn Sie einige Aufgaben in vordefinierter Reihenfolge ausführen müssen, müssen Sie nicht nur festlegen dependsOn, sondern auch mustRunAfterEigenschaften für diese Aufgaben festlegen , wie im folgenden Code:

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

dependsOndefiniert keine Reihenfolge der Aufgabenausführung, sondern macht nur eine Aufgabe von einer anderen abhängig, während dies der mustRunAfterFall ist.


Wäre es damit noch möglich, die Aufgaben ausschließlich auszuführen?
Niklas

15
Ich bekomme diesen FehlerCannot invoke method mustRunAfter() on null object
Niklas

1
Außerdem muss Ihre cleanBuildPublish-Aufgabe nach allen drei abhängigen Aufgaben in Ihrem Build-Skript platziert werden
Stanislav

1
Stellen Sie sicher, dass Sie das setzen, cleanBuildPublishnachdem alle einzelnen Aufgaben definiert wurden. Gradle-Aufgaben werden anscheinend von oben nach unten gelesen. Das löste mein Problem fürCannot invoke method mustRunAfter() on null object
baskInEminence

2
Es ist wichtig zu erwähnen, dass Gradle nicht auf das Ende der Aufgabe wartet
MontrealDevOne

95

Sie können auch die aufgerufene Task-Basisklasse verwenden GradleBuild

Hier, wie Sie das machen können GradleBuild

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

1
Also wird die Aufgabe in der angegebenen Reihenfolge ausgeführt?
Mangesh Kadam

1
Kotlin-Version davon?
Mani

Kotlin Version wäre sehr ähnlich. Sie möchten nur project.tasks.registerIhre Aufgabe erstellen und das ist alles.
Tasomaniac

7
Das Gradle-Projekt rät ausdrücklich davon ab: docs.gradle.org/current/userguide/…
Alex

3

Versuchen Sie unten, cleanBuildPublish von anderen Aufgaben abhängig zu machen

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

Ausgabe

$ 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

Weitere Informationen finden Sie unter https://docs.gradle.org/current/userguide/more_about_tasks.html#addDependencyUsingTask


Immer noch nicht. Ausgabe: pastebin.com/8knNfLEY Gradle Aufgabe pastebin.com/NaHhdRkA
Niklas

Bitte teilen Sie Ihre build.gradle-Datei
Santosh Gokak

Projekt: pastebin.com/4uN9Usvd Kalendermodul: pastebin.com/CPzYKNqx Publishing.gradle pastebin.com/XMMQUG4C
Niklas

3

Wenn sich die Veröffentlichungsaufgabe in einem Unterprojekt mit dem Namen subProjectName befindet,

...
tasks.findByPath(':subProjectName:publish').mustRunAfter 'build'
...


0

Hier ist, wie ich es mit Kotlin-Skripten gemacht habe, wobei sowohl abhängige als auch mustRunAfter verwendet wurden. Hier ist ein Beispiel für die Ausführung von zwei Aufgaben, eine (benutzerdefinierte registrierte "importUnicodeFiles" -Aufgabe), die sich in "diesem" Projekt befindet, und eine (vordefinierte "Ausführen" -Aufgabe), die sich in einem Geschwisterprojekt mit dem Namen ": unicode" befindet:

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

Die Gradle-Entwickler raten im Allgemeinen von diesem Ansatz ab (sie sagen, dass das Erzwingen von Bestellungen schlecht ist und das Ausführen von Aufgaben aus anderen Projekten schlecht ist) und arbeiten an einer Möglichkeit, Ergebnisse zwischen Projekten zu veröffentlichen. Siehe: https://docs.gradle.org/current/userguide/cross_project_publications.html


-1

Hier ist, wie ich es mit Kotlin-Skripten gemacht habe, wobei sowohl abhängige als auch mustRunAfter verwendet wurden. Hier ist ein Beispiel für die Ausführung von zwei Aufgaben, eine (benutzerdefinierte registrierte "importUnicodeFiles" -Aufgabe), die sich in "diesem" Projekt befindet, und eine (vordefinierte "Ausführen" -Aufgabe), die sich in einem Geschwisterprojekt mit dem Namen ": unicode" befindet:

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

-3

Versuchen Sie, defaultTasksbuild.gradle hinzuzufügen. Zum Beispiel. defaultTasks 'clean', 'build', 'publish'

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.