Czy istnieje sposób na wyświetlenie zależności zadań w Gradle?


139

./gradle taskswymienia „niektóre” z zadań. Patrząc na http://gradle.org/docs/current/userguide/java_plugin.html , są ukryte, których nie ma na liście. Ponadto inne wtyczki nie będą miały tak ładnego, ładnego wykresu zależności między zadaniami.

Czy jest sposób

  1. wypisuje wszystkie zadania we wszystkich wtyczkach z gradle
  2. wypisz zadania i od jakich zadań zależą (trochę jak maven, dependency:treeale w przypadku zadań)

Odpowiedzi:


99

możesz użyć flagi --all, aby uzyskać bardziej szczegółową listę dostępnych zadań i ich zależności

gradle tasks --all

EDYCJA: jak zauważył Radim w komentarzach, to polecenie nie zgłasza zależności, dla gradle 3.3 i nowszych (patrz https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-tasks- raport ).


wydaje się, że nie ma na liście zadań pobierania zależności z sieci WWW w dowolnym miejscu ??? Uruchomienie zadania zaćmienia wyraźnie pobiera rzeczy, ale nie jesteś pewien, gdzie jest ta zależność ... nie ma sposobu, aby ją przeciążać?
— Dean Hiller

2
czynność pobierania zasobów nie jest powiązana z dedykowanym zadaniem. Zależności w gradle są dodawane do konfiguracji. Gdy tylko Ty (we własnej implementacji zadania) lub gradle (w swoich własnych zadaniach) odniesiesz się do plików tej konfiguracji, zostanie uruchomiony mechanizm rozwiązywania.
— Rene Groeschke

54
To nie wymienia zależności, przynajmniej w Gradle 1.5 lub 1.7. Czy to tak, że kiedyś to zrobił, czy też jest to niepełna odpowiedź?
— Tom Anderson,

10
Działa tylko dla klasy starszej niż 3.3. Nastąpiła zmiana w raportowaniu zadań, która spowodowała usunięcie tego wyniku.
— Radim

135

wypisz zadania i od jakich zadań zależą (coś w rodzaju zależności mavena: drzewo, ale dla zadań)

w tym celu można użyć --dry-run(lub -m) opcji, która wyświetla zadania, które są wykonywane w kolejności dla danego polecenia, ale nie wykonuje polecenia, np.

gradle assemble --dry-run

możesz znaleźć więcej tutaj


2
To nie wyświetla drzewa zadań ani zależności zadań, a jedynie listę zadań, które zostałyby wykonane.
— bcampolo

@bcampolo Jaka jest różnica?
— kiltek

39

Możesz wypróbować wtyczkę com.dorongold.task-tree z prostym użyciem:

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

Przykładowy wynik z pliku readme :

gradle build taskTree

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

5
Aby uzyskać czystszy wydruk, użyj --no-repeat. Źródło: github.com/dorongold/gradle-task-tree
— AlikElzin-kilaka,

30

Możesz to umieścić w 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
        }
    }
}

lub to do twojego 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")
        }
    }
})

Następnie uruchom zadanie za pomocą gradle:

./gradlew build

Powinieneś zobaczyć to:

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

Wygląda to trochę jak wykres, ale tak naprawdę zależy od każdego zadania. Jest to lista węzłów z rodzicami każdego węzła. Więc jeśli twój wykres wygląda jak A <- B <- (C and D), to pokaże ci B-A, C-B, D-B. Nadal pomaga niektórym!
— Noumenon

1
Powinien to być wykres, ale renderowanie wykresu jest nietrywialne. Wynik powyższego kodu zawiera tylko bezpośrednie zależności zadania.
— cstroe

15

Drzewo zadań gradle można wizualizować za pomocą gradle tasks --all lub wypróbować następujące wtyczki:

Graphs Gradle i Talaiot: spójrz na to: https://proandroiddev.com/graphs-gradle-and-talaiot-b0c02c50d2b1 blog, ponieważ zawiera graficzną listę zadań i zależności. Wykorzystuje darmowe, otwarte narzędzie Graphviz Gephi ( https://gephi.org/features/ )

drzewo zadań-gradle : https://github.com/dorongold/gradle-task-tree and

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

  1. Wtyczka gradle-visteg : Wygenerowany plik można poddać dalszej obróbce za pomocą narzędzia Graphviz dot .

  2. Na przykład obraz png jest tworzony w następujący sposób:

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

Więcej informacji można znaleźć na stronie głównej Graphviz .

Jakiekolwiek zadania są faktycznie używane do uruchomienia zadania (np .:), buildmożna wyświetlić na ładnej stronie HTML za pomocą --profileopcji

gradle --profile czysta kompilacja

Po zakończeniu przejdź do folderu build / reports / profile i przeglądaj plik .html. Zobaczysz rozwiązywanie zależności i inne informacje z czasem na ładnej stronie HTML.


11
Raport nie zawiera żadnych informacji o zależnościach między zadaniami. Po prostu wyświetla sekwencyjnie wszystkie zadania, które zostały wykonane podczas kompilacji.
— rwitzel

7

Możesz programowo uzyskać dostęp do wykresu zadań, aby sprawdzić go w skrypcie kompilacji za pomocą Gradle.getTaskGraph ()


6
gradle.getTaskGraph () pokazuje tylko zadania, które zostaną wykonane w twojej aktualnej kompilacji gradle ORAZ ten taskGraph jest dostępny tylko w fazie wykonywania.
— Rene Groeschke

3

W miarę jak Twój multiprojekt rośnie, rozwiązanie, które oznaczyłem jako poprawne, staje się nieco nieczytelne i trudne do odczytania

gradle tasks --all

Zamiast tego przeszedłem do przyjrzenia się konkretnemu projektowi, co znacznie uprościło sprawę

gradlew :full-httpproxy:tasks --all

gdzie „full-httpproxy” to nazwa mojego projektu (i typowego katalogu).

Jestem jednak ciekawy, jak wymienić zadania w projekcie głównym / głównym i mam tu również ważne pytanie

Jak wyświetlić listę wszystkich zadań dla projektu głównego tylko w Gradle?

ponieważ nie wydaje się to teraz możliwe.



0

Po odpowiedzi udzielonej przez cstroe, poniżej również wypisuje pliki wejściowe i wyjściowe każdego zadania Gradle. Jest to przydatne, ponieważ zależności są czasami definiowane przez relacje wejścia / wyjścia. To znaczy, jeśli zadanie B wykorzystuje dane wyjściowe zadania A, odpowiedź cstroe nie pokaże zależności. Poniższe jest bardzo prymitywne, ale pokazuje listę plików wejściowych i wyjściowych dla każdego zadania:

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)}
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.