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.