Чи є спосіб перелічити залежності задач у Gradle?


139

./gradle tasksперелічує "деякі" із завдань. Переглядаючи http://gradle.org/docs/current/userguide/java_plugin.html є приховані, які не перераховані. Крім того, інші плагіни не матимуть такого приємного графіка залежностей між завданнями.

Чи є шлях до цього

  1. перерахуйте всі завдання у всіх плагінах з gradle
  2. перелічіть завдання і від яких завдань вони залежать (на зразок Maven's, dependency:treeале для завдань)

Відповіді:


99

ви можете використовувати прапор --all для отримання більш детального переліку доступних завдань та залежностей від задач

gradle tasks --all

EDIT: як зазначає Radim у коментарях, ця команда не повідомляє про залежності, для gradle 3.3 та новіших (див. Https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-tasks- звіт ).


не здається, перелічено завдання для завантаження залежностей з Інтернету куди завгодно ??? Запускаючи затемнення завдань, чітко завантажуйте речі, але не знаєте, де ця залежність ... немає способу перевантажити її?
Дін Гіллер

2
дія завантаження ресурсів не прив’язана до виділеного завдання. Залежності в градусах додаються до конфігурацій. Як тільки ви (у власній реалізації завдання) або gradle (у власних наданих завданнях) посилаєтесь на файли цієї конфігурації, спрацьовує механізм вирішення.
Рене Гроешке

54
Це не перераховує залежності, принаймні, з Gradle 1.5 або 1.7. Це колись це робив, чи це неповна відповідь?
Том Андерсон

10
Працює лише для градул старше 3,3. У звіті про завдання відбулася зміна, яка видалила цей вихід.
Радім

135

перелічіть завдання і від яких завдань вони залежать (на кшталт Maven’s залежність: дерево, але для завдань)

для цього ви можете скористатися параметром --dry-run(або -m), який перераховує завдання, які виконуються для певної команди, але не виконує команду, наприклад

gradle assemble --dry-run

ви можете знайти більше тут


2
У цьому списку не вказано дерево завдань або залежності від задач, воно лише перелічує, які завдання були б виконані.
bcampolo

@bcampolo У чому різниця?
kiltek

39

Ви можете спробувати плагін com.dorongold.task-tree з простим використанням:

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

Приклад результату readme :

gradle build taskTree

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

5
Для більш чистого виходу використовуйте --no-repeat. Джерело: github.com/dorongold/gradle-task-tree
AlikElzin-kilaka

30

Ви можете вставити це у свої 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
        }
    }
}

або це у ваш 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")
        }
    }
})

Потім запустіть своє завдання з gradle:

./gradlew build

І ви повинні побачити це:

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

Це схоже на графік, але насправді залежить лише те, від чого залежить кожне завдання. Це список вузлів з батьками кожного вузла. Отже, якщо ваш графік виглядає так A <- B <- (C and D), це покаже вам B-A, C-B, D-B. Це все ще допомагає деяким!
Ноумен

1
Це має бути графік, але візуалізація графіка нетривіальна. Вихід з вищевказаного коду просто перераховує безпосередні залежності задачі.
cstroe

15

дерево завдань Gradle можна візуалізувати за допомогою gradle tasks --all або спробувати наступні плагіни:

Графіки Gradle та Talaiot: Подивіться на це: https://proandroiddev.com/graphs-gradle-and-talaiot-b0c02c50d2b1 блог, оскільки в ньому перераховано графічний перегляд завдань та залежностей. Для цього використовується безкоштовний відкритий інструмент Graphviz Gephi ( https://gephi.org/features/ )

gradle-task-tree : https://github.com/dorongold/gradle-task-tree та

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

  1. gradle-visteg плагін: Створений файл можна буде обробляти за допомогою утиліти Graphviz dot .

  2. Наприклад , зображення PNG створюється наступним чином:

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

Для отримання додаткової інформації відвідайте домашню сторінку Graphviz .

Які б завдання не використовувались для виконання завдання (наприклад:), buildможна переглянути на хорошій HTML-сторінці--profile параметра

Gradle --profile чистої збірки

Після цього перейдіть до створення папки / звітів / профілю та перегляньте файл .html. Ви побачите роздільну здатність залежностей та іншу інформацію з часом, який пройшов на приємній html-сторінці.


11
Звіт не містить жодної інформації про залежності між завданнями. Він просто перераховує послідовно всі завдання, які були виконані під час збирання.
rwitzel

7

Ви можете програмно отримати доступ до графіка завдань, щоб перевірити його в сценарії збірки за допомогою Gradle.getTaskGraph ()


6
gradle.getTaskGraph () показує лише ті завдання, які будуть виконуватися у вашій поточній збірці gradle І ця задачаGraph доступна лише на етапі виконання.
Рене Гроешке

3

У міру того, як ваш мультипроект зростає, рішення, яке я позначив як правильне, стає трохи неприємним і важким для читання

gradle tasks --all

Натомість я перейшов до розгляду конкретного проекту, що значно полегшує його

gradlew :full-httpproxy:tasks --all

де 'full-httpproxy' - назва мого проекту (і каталог, як це характерно).

Мені все ж цікаво, як перелічити завдання в проекті master / root, і тут також є невирішене питання

Як перелічити всі завдання для головного проекту лише у gradle?

як це робити зараз не здається можливим.



0

Після відповіді за допомогою cstroe, наступне також друкує вхідні та вихідні файли кожного завдання Gradle. Це корисно, оскільки залежності залежно від часу визначаються співвідношеннями вводу / виводу. Тобто, якщо завдання B використовує результати завдання A, відповідь cstroe не покаже вам залежності. Далі дуже примітивно, але показує список вхідних та вихідних файлів для кожного завдання:

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)}
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.