Есть ли способ перечислить зависимости задач в Gradle?

139

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

Есть ли способ

  1. перечислить все задачи во всех плагинах с Gradle
  2. перечислите задачи и от каких задач они зависят (вроде как у maven, dependency:treeно для задач)
Дин Хиллер
источник

Ответы:

99

Вы можете использовать флаг --all, чтобы получить более подробный список доступных задач и зависимостей задач

gradle tasks --all

РЕДАКТИРОВАТЬ: как отметил Радим в комментариях, эта команда не сообщает о зависимостях, для версии 3.3 и новее (см. Https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-tasks- отчет ).

Рене Грошке
источник
кажется, что нигде не перечислены задачи для загрузки зависимостей из Интернета ??? Запуск задачи eclipse явно загружает материал, но не уверен, где находится эта зависимость ... нет способа ее перегрузить?
Дин Хиллер
2
действие загрузки ресурсов не привязано к выделенной задаче. Зависимости в Gradle добавляются в Конфигурации. Как только вы (в своей собственной реализации задач) или gradle (в своих предоставленных задачах) ссылаетесь на файлы этой конфигурации, механизм разрешения запускается.
Рене Грошке
54
Это не перечисляет зависимости, по крайней мере с Gradle 1.5 или 1.7. Это то, что он когда-то делал, или это неполный ответ?
Том Андерсон
10
Работает только для выпускников старше 3.3. Произошло изменение в отчете о задачах, которое удалило этот вывод.
Радим
135

перечислите задачи и от каких задач они зависят (вроде как maven's depenceny: tree, но для задач)

для этого вы можете использовать --dry-run(или -m) опцию, которая перечисляет задачи, которые выполняются для определенной команды, но не выполняет команду, например

gradle assemble --dry-run

Вы можете найти больше здесь

Марко Вранькович
источник
2
Это не список дерева задач или зависимостей задач, он просто перечисляет, какие задачи были бы выполнены.
bcampolo
@bcampolo Какая разница?
килтек
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
Алик Эльзин-килака
31

Вы можете вставить это в свой 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
cstroe
источник
Это немного похоже на график, но на самом деле именно от этого зависит каждая задача. Это список узлов с родителями каждого узла. Так что, если ваш график выглядит 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 : 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 чистой сборки

После этого перейдите в папку build / reports / profile и просмотрите файл .html. Вы увидите разрешение зависимостей и другую информацию со временем, которое потребовалось на красивой HTML-странице.

АКС
источник
11
Отчет не содержит никакой информации о зависимостях между задачами. Он просто перечисляет последовательно все задачи, которые были выполнены во время сборки.
rwitzel
7

Вы можете программно получить доступ к графу задач, чтобы проверить его в скрипте сборки, используя Gradle.getTaskGraph ()

Дилан Биджнагте
источник
6
gradle.getTaskGraph () показывает только те задачи, которые будут выполнены в вашей текущей сборке gradle, и этот taskGraph доступен только на этапе выполнения.
Рене Грошке
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)}
    }
}
nimrodm
источник