有没有办法在Gradle中列出任务依赖项?

时间:2012-05-02 21:33:17

标签: gradle

./gradle tasks列出了“部分”任务。看着 http://gradle.org/docs/current/userguide/java_plugin.html隐藏的未列出。此外,其他插件将不会有如此漂亮的任务之间的依赖关系图。

有没有办法

  1. 列出所有使用gradle的插件中的所有任务
  2. 列出任务及其所依赖的任务(有点像maven的depenceny:tree但是对于任务而言)

11 个答案:

答案 0 :(得分:92)

您可以使用--all标志来获取可用任务和任务依赖关系的更详细列表

gradle tasks --all

编辑:正如Radim在评论中所指出的,对于gradle 3.3和更新版本,此命令不报告依赖关系(参见https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-tasks-report)。

答案 1 :(得分:71)

  

列出任务以及他们依赖的任务(有点像maven的   depenceny:树,但任务)

为此,您可以使用--dry-run(或-m)选项,该选项列出为执行特定命令而执行的任务,但不执行命令,例如

gradle assemble --dry-run

您可以找到更多here

答案 2 :(得分:20)

您可以使用简单的用法试用com.dorongold.task-tree插件:

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

答案 3 :(得分:19)

您可以将其添加到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
        }
    }
}

然后用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

答案 4 :(得分:13)

gradle - 个人资料清理构建

完成后,转到build / reports / profile文件夹并浏览.html文件。您将在一个漂亮的html页面中看到依赖项解析和其他信息。

答案 5 :(得分:7)

您可以使用Gradle.getTaskGraph()

以编程方式访问任务图以在构建脚本中检查它

答案 6 :(得分:2)

随着您的多项目的增长,我标记为正确的解决方案变得有点不整洁且难以阅读

gradle tasks --all

相反,我已经转移到了一个特定的项目,让它更容易

gradlew :full-httpproxy:tasks --all

其中'full-httpproxy'是我的项目的名称(和典型的目录一样)。

但我很好奇如何列出主/根项目上的任务,并且在这里也有一个悬而未决的问题

How to list all tasks for the master project only in gradle?

因为这样做现在似乎不可能。

答案 7 :(得分:2)

为此提供了一个新插件:

plugins {
    id 'org.barfuin.gradle.taskinfo' version '1.0.1'
}

然后您可以输入:

./gradlew tiTree assemble

得到这样的东西:

:assemble                             (org.gradle.api.DefaultTask)
+--- :jar                             (org.gradle.api.tasks.bundling.Jar)
|    `--- :classes                    (org.gradle.api.DefaultTask)
|         +--- :compileJava           (org.gradle.api.tasks.compile.JavaCompile)
|         `--- :processResources      (org.gradle.language.jvm.tasks.ProcessResources)
+--- :javadocJar                      (org.gradle.api.tasks.bundling.Jar)
|    `--- :javadoc                    (org.gradle.api.tasks.javadoc.Javadoc)
|         `--- :classes               (org.gradle.api.DefaultTask)
|              +--- :compileJava      (org.gradle.api.tasks.compile.JavaCompile)
|              `--- :processResources (org.gradle.language.jvm.tasks.ProcessResources)
`--- :sourcesJar                      (org.gradle.api.tasks.bundling.Jar)

该插件还可以显示任务执行的顺序:

In order to execute task ':assemble', the following tasks would be executed in this order:

  1. :compileJava      (org.gradle.api.tasks.compile.JavaCompile)
  2. :processResources (org.gradle.language.jvm.tasks.ProcessResources)
  3. :classes          (org.gradle.api.DefaultTask)
  4. :jar              (org.gradle.api.tasks.bundling.Jar)
  5. :javadoc          (org.gradle.api.tasks.javadoc.Javadoc)
  6. :javadocJar       (org.gradle.api.tasks.bundling.Jar)
  7. :sourcesJar       (org.gradle.api.tasks.bundling.Jar)
  8. :assemble         (org.gradle.api.DefaultTask)

the plugin's docs中的更多信息。
完全公开:我是gradle-taskinfo的作者。

答案 8 :(得分:1)

按照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)}
    }
}

答案 9 :(得分:0)

您还可以为您的本地环境build.gradle https://github.com/dorongold/gradle-task-tree

添加以下插件

答案 10 :(得分:0)

如果插件不适合你,你可以在 build.gradle 中使用这个要点

https://gist.github.com/jrodbx/046b66618c558ca9002a825629d59cde