Чи є спосіб перелічити залежності задач у 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.