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'
}
Niklas
quelle
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.

Stanislav
quelle
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']
}
tasomanisch
quelle
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

Santosh Gokak
quelle
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'
...
Asanka
quelle
2

Mein Ansatz ist

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

Das funktioniert bei mir.

Codev
quelle
2
Das Gradle-Projekt rät ausdrücklich davon ab: docs.gradle.org/current/userguide/…
Alex
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

cpurdy
quelle
-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)
}
cpurdy
quelle
-3

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

Sumit Pal Singh
quelle