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


139

./gradle tasks列出了“一些”任务。查看 http://gradle.org/docs/current/userguide/java_plugin.html,其中未列出隐藏的内容。另外,其他插件将无法很好地展现任务之间的依赖关系。

有没有办法

  1. 用gradle列出所有插件中的所有任务
  2. 列出任务以及它们所依赖的任务(类似于maven,dependency:tree但用于任务)

Answers:


99

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

gradle tasks --all

编辑:正如Radim在评论中指出的那样,对于gradle 3.3及更高版本,此命令不报告依赖项(请参阅https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-tasks-报告)。


它似乎没有列出从网络上任何地方下载依赖项的任务???运行任务eclipse显然会下载内容,但不确定该依赖项在哪里...无法重载它吗?
迪安·希勒

2
下载资源的操作未绑定到专用任务。gradle中的依赖项已添加到配置中。一旦您(在您自己的任务实现中)或gradle(在其自己提供的任务中)引用此配置的文件,就会触发解析机制。
Rene Groeschke 2012年

54
至少在Gradle 1.5或1.7中,它没有列出依赖项。是曾经做过一次,还是一个不完整的答案?
汤姆·安德森

10
仅适用于早于3.3的gradle。任务报告发生了变化,删除了此输出。
Radim

135

列出任务以及它们所依赖的任务(类似于maven的depenceny:tree,但用于任务)

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

gradle assemble --dry-run

你可以在这里找到更多


2
这没有列出任务树或任务依赖项,而只是列出了将要执行的任务。
bcampolo

@bcampolo有什么区别?
kiltek

39

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

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

自述文件的示例结果:

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。它仍然可以帮助一些!
Noumenon

1
它应该是一个图形,但是渲染图形并非易事。上面代码的输出仅列出了任务的直接依赖关系。
cstroe

15

gradle任务树可以通过以下插件可视化gradle tasks --all 尝试以下插件:

Graphs Gradle和Talaiot: 对此进行研究:https ://proandroiddev.com/graphs-gradle-and-talaiot-b0c02c50d2b1博客,因为它以图形方式列出了查看任务和依赖项。它使用免费的开放式Graphviz工具Gephihttps://gephi.org/features/

gradle-task-treehttps : //github.com/dorongold/gradle-task-tree

gradle-visteghttps//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可以使用--profile选项在漂亮的HTML页面中查看实际上用于运行任务的任何任务(例如:)

gradle --profile干净的构建

完成此操作后,转到build / reports / profile文件夹并浏览.html文件。您会在一个漂亮的html页面中看到依赖关系解析和其他信息以及所花费的时间。


11
该报告不包含有关任务之间的依赖关系的任何信息。它只是顺序列出了在构建过程中执行的所有任务。
rwitzel


3

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

gradle tasks --all

取而代之的是,我转向了一个特定的项目,这使它变得更加容易

gradlew :full-httpproxy:tasks --all

其中“ full-httpproxy”是我的项目的名称(和典型的目录)。

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

如何仅在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)}
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.