Gibt es eine Möglichkeit, Aufgabenabhängigkeiten in Gradle aufzulisten?


139

./gradle taskslistet "einige" der Aufgaben auf. Unter http://gradle.org/docs/current/userguide/java_plugin.html sind versteckte Objekte nicht aufgeführt. Auch andere Plugins haben keine so schöne Grafik der Abhängigkeiten zwischen Aufgaben.

Gibt es einen Weg zu

  1. liste alle aufgaben in allen plugins mit gradle auf
  2. Listen Sie die Aufgaben auf und von welchen Aufgaben sie abhängen (ähnlich wie bei Maven, dependency:treeaber für Aufgaben).

Antworten:


99

Mit dem Flag --all können Sie eine detailliertere Liste der verfügbaren Aufgaben und der Aufgabenabhängigkeiten erhalten

gradle tasks --all

BEARBEITEN: Wie von Radim in den Kommentaren angegeben, meldet dieser Befehl keine Abhängigkeiten für Gradle 3.3 und höher (siehe https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-tasks- Bericht ).


es scheint keine Aufgabe zum Herunterladen von Abhängigkeiten aus dem Web irgendwo aufzulisten ??? Wenn Sie die Task-Eclipse ausführen, laden Sie die Inhalte eindeutig herunter, sind sich aber nicht sicher, wo diese Abhängigkeit liegt ... keine Möglichkeit, sie zu überladen?
Dean Hiller

2
Das Herunterladen von Ressourcen ist nicht an eine bestimmte Aufgabe gebunden. Abhängigkeiten in Gradle werden zu Konfigurationen hinzugefügt. Sobald Sie (in Ihrer eigenen Aufgabenimplementierung) oder gradle (in den eigenen bereitgestellten Aufgaben) auf die Dateien dieser Konfiguration verweisen, wird der Auflösungsmechanismus ausgelöst.
Rene Groeschke

54
Dies listet die Abhängigkeiten nicht auf, zumindest nicht mit Gradle 1.5 oder 1.7. Ist es das, was es einmal getan hat, oder ist dies eine unvollständige Antwort?
Tom Anderson

10
Funktioniert nur für Gradle älter als 3.3. Es gab eine Änderung in der Aufgabenberichterstattung , durch die diese Ausgabe entfernt wurde.
Radim

134

Listen Sie die Aufgaben auf und von welchen Aufgaben sie abhängen (ähnlich wie die Abhängigkeit von Maven: Baum, aber für Aufgaben)

Hierfür können Sie die Option --dry-run(oder -m) verwenden, mit der Aufgaben aufgelistet werden, die für einen bestimmten Befehl ausgeführt werden, den Befehl jedoch nicht ausführen, z

gradle assemble --dry-run

mehr finden Sie hier


2
Dies listet keinen Aufgabenbaum oder Aufgabenabhängigkeiten auf, sondern nur, welche Aufgaben ausgeführt worden wären.
Bcampolo

@bcampolo Was ist der Unterschied?
Kiltek

39

Sie können das Plugin com.dorongold.task-tree mit einfacher Verwendung ausprobieren :

gradle <task 1>...<task N> taskTree

Beispielergebnis aus der Readme :

gradle build taskTree

:build
+--- :assemble
|    \--- :jar
|         \--- :classes
|              +--- :compileJava
|              \--- :processResources
\--- :check
     \--- :test
          +--- :classes
          |    +--- :compileJava
          |    \--- :processResources
          \--- :testClasses
               +--- :compileTestJava
               |    \--- :classes
               |         +--- :compileJava
               |         \--- :processResources
               \--- :processTestResources

5
Verwenden Sie für eine sauberere Ausgabe --no-repeat. Quelle: github.com/dorongold/gradle-task-tree
AlikElzin-kilaka

30

Sie können dies in Ihre build.gradle:

gradle.taskGraph.whenReady {taskGraph ->
    println "Found task graph: " + taskGraph
    println "Found " + taskGraph.allTasks.size() + " tasks."
    taskGraph.allTasks.forEach { task ->
        println task
        task.dependsOn.forEach { dep ->
            println "  - " + dep
        }
    }
}

oder dies in Ihre build.gradle.kts:

gradle.taskGraph.whenReady(closureOf<TaskExecutionGraph> {
    println("Found task graph: $this")
    println("Found " + allTasks.size + " tasks.")
    allTasks.forEach { task ->
        println(task)
        task.dependsOn.forEach { dep ->
            println("  - $dep")
        }
    }
})

Führen Sie dann Ihre Aufgabe mit gradle aus:

./gradlew build

Und Sie sollten dies sehen:

Found task graph: org.gradle.execution.taskgraph.DefaultTaskGraphExecuter@36eb780c
Found 19 tasks.
task ':compileJava'
  - task 'compileJava' input files
task ':compileScala'
  - task 'compileScala' input files
  - compileJava
task ':processResources'
  - task 'processResources' input files
task ':classes'
  - org.gradle.api.internal.tasks.DefaultTaskDependency@287a7782
  - task 'classes' input files
  - compileJava
  - dirs
  - compileScala
  - processResources
task ':jar'
  - task 'jar' input files
task ':assemble'
  - task 'assemble' input files
  - org.gradle.api.internal.artifacts.DefaultPublishArtifactSet$ArtifactsTaskDependency@5bad9616
task ':compileTestJava'
    - task 'compileTestJava' input files
task ':compileTestScala'
  - task 'compileTestScala' input files
  - compileTestJava
task ':processTestResources'
  - task 'processTestResources' input files
task ':testClasses'
  - processTestResources
  - task 'testClasses' input files
  - compileTestScala
  - org.gradle.api.internal.tasks.DefaultTaskDependency@42c1fa08
  - compileTestJava
  - dirs
task ':compileIntegrationTestJava'
  - task 'compileIntegrationTestJava' input files
task ':compileIntegrationTestScala'
  - task 'compileIntegrationTestScala' input files
  - compileIntegrationTestJava
task ':processIntegrationTestResources'
  - task 'processIntegrationTestResources' input files
task ':integrationTestClasses'
  - processIntegrationTestResources
  - compileIntegrationTestJava
  - org.gradle.api.internal.tasks.DefaultTaskDependency@7c8aa0fe
  - compileIntegrationTestScala
  - dirs
  - task 'integrationTestClasses' input files
task ':composeUp'
  - task 'composeUp' input files
task ':integrationTest'
  - task ':composeUp'
  - task 'integrationTest' input files
task ':test'
  - task 'test' input files
task ':check'
  - task 'check' input files
  - task ':test'
  - task ':integrationTest'
task ':build'
  - task 'build' input files
  - check
  - assemble

Das sieht ein bisschen wie ein Diagramm aus, aber es ist wirklich genau das, wovon jede Aufgabe abhängt. Es ist eine Liste von Knoten mit den Eltern jedes Knotens. Wenn Ihr Diagramm also so aussieht A <- B <- (C and D), wird es Ihnen angezeigt B-A, C-B, D-B. Es hilft immer noch einigen!
Noumenon

1
Es sollte ein Diagramm sein, aber das Rendern eines Diagramms ist nicht trivial. Die Ausgabe des obigen Codes listet nur die unmittelbaren Abhängigkeiten einer Aufgabe auf.
Cstroe

15

Der Gradle-Aufgabenbaum kann durch oder visualisiert werdengradle tasks --all die folgenden Plugins ausprobiert werden:

Diagramme Gradle und Talaiot: Sehen Sie sich Folgendes an: https://proandroiddev.com/graphs-gradle-and-talaiot-b0c02c50d2b1 Blog, in dem Aufgaben und Abhängigkeiten grafisch angezeigt werden. Dies verwendet das kostenlose geöffnete Graphviz-Tool Gephi ( https://gephi.org/features/ ).

gradle-task-tree : https://github.com/dorongold/gradle-task-tree und

gradle-visteg : https://github.com/mmalohlava/gradle-visteg

  1. gradle-visteg- Plugin: Die generierte Datei kann über das Dienstprogramm Graphviz nachbearbeitet werden dot.

  2. Zum Beispiel wird ein PNG-Bild wie folgt erzeugt:

    cd build/reports/; dot -Tpng ./visteg.dot -o ./visteg.dot.png

Weitere Informationen finden Sie auf der Graphviz -Homepage.

Alle Aufgaben, die tatsächlich zum Ausführen einer Aufgabe verwendet werden (z. buildB. :), können mit der --profileOption in einer schönen HTML-Seite angezeigt werden

Gradle - Profil sauber bauen

Sobald dies abgeschlossen ist, gehen Sie zum Ordner build / reports / profile und durchsuchen Sie die HTML-Datei. Auf einer schönen HTML-Seite sehen Sie die Auflösung von Abhängigkeiten und andere Informationen mit der Zeit, die dafür benötigt wurde.


11
Der Bericht enthält keine Informationen zu den Abhängigkeiten zwischen Aufgaben. Es werden nur nacheinander alle Aufgaben aufgelistet, die während des Builds ausgeführt wurden.
Rwitzel

7

Sie können programmgesteuert auf das Aufgabendiagramm zugreifen, um es im Build-Skript mithilfe von Gradle.getTaskGraph () zu überprüfen.


6
gradle.getTaskGraph () zeigt Ihnen nur die Aufgaben an, die in Ihrem aktuellen Gradle-Build ausgeführt werden, UND dieser taskGraph ist nur in der Ausführungsphase verfügbar.
Rene Groeschke

3

Wenn Ihr Multiprojekt wächst, wird die Lösung, die ich als korrekt markiert habe, etwas unfreundlich und schwer zu lesen

gradle tasks --all

Stattdessen habe ich mir ein bestimmtes Projekt angesehen, um es viel einfacher zu machen

gradlew :full-httpproxy:tasks --all

Dabei ist 'full-httpproxy' der Name meines Projekts (und das typische Verzeichnis).

Ich bin jedoch neugierig, wie man Aufgaben im Master / Root-Projekt auflistet, und habe auch hier eine offene Frage

Wie liste ich alle Aufgaben für das Masterprojekt nur in Gradle auf?

Das scheint momentan nicht möglich zu sein.



0

Nach der Antwort von cstroe werden im Folgenden auch die Eingabe- und Ausgabedateien jeder Gradle-Aufgabe gedruckt. Dies ist nützlich, da Abhängigkeiten manchmal durch Eingabe / Ausgabe-Beziehungen definiert werden. Das heißt, wenn Aufgabe B die Ausgaben von Aufgabe A verwendet, zeigt die Antwort von cstroe nicht die Abhängigkeit. Das Folgende ist sehr primitiv, zeigt jedoch die Liste der Eingabe- und Ausgabedateien für jede Aufgabe:

gradle.taskGraph.whenReady {taskGraph ->
    println "Found task graph: " + taskGraph
    println "Found " + taskGraph.allTasks.size() + " tasks."
    taskGraph.allTasks.forEach { task ->
        println()
        println("----- " + task + " -----")
        println("depends on tasks: " + task.dependsOn)
        println("inputs: ")
        task.inputs.getFiles().getFiles().collect { f -> println(" - " + f)}
        println("outputs: ")
        task.outputs.getFiles().getFiles().collect { f -> println(" + " + f)}
    }
}
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.