从构建脚本获取所有Gradle任务的列表

从构建脚本获取所有Gradle任务的列表,gradle,groovy,build.gradle,Gradle,Groovy,Build.gradle,所以我试图将所有gradle任务的列表写入一个文件。当然,我可以使用tasks命令来实现这一点,但我希望每次调用任何其他gradle命令时都将其缓存到一个文件中。因此,无论何时运行/gradlew build,我都希望将可用的任务写入文件 这似乎很简单,我写了下面的任务来尝试它: task cacheTasks() { doLast { allprojects { p -> p.tasks*.each { t ->

所以我试图将所有gradle任务的列表写入一个文件。当然,我可以使用
tasks
命令来实现这一点,但我希望每次调用任何其他gradle命令时都将其缓存到一个文件中。因此,无论何时运行
/gradlew build
,我都希望将可用的任务写入文件

这似乎很简单,我写了下面的任务来尝试它:

task cacheTasks() {
    doLast {
        allprojects { p ->
            p.tasks*.each { t ->
                println(p.name + ":" + t.name)
            }
        }
    }
}
问题是,我只得到所有可用任务的子集。当我运行
/gradlew任务--all
命令时,会打印更多的任务。当我在
任务*
列表上循环时,似乎没有任何内置任务(如
构建
清理
帮助
)在
任务*
列表中,但奇怪的是,我可以直接引用它们:

tasks.build { t ->
    println("DEBUG:" + t.name)
}

这看起来很简单,但我一直在徒劳地寻找解决方案。我甚至试着在gradle源代码中查看
任务是如何工作的,但是我找不到任何线索来解释为什么这不起作用。

我非常怀疑容器中是否有名为
build
的任务类

这是调试任务时得到的结果:


我不是说
GradleBuild
不运行,但它可以是其他形式的,可能是
org.gradle.api.tasks.GradleBuild
的一个实例。(我不是很确定,因为gradle源代码对我来说很难编译和运行)

使用时

tasks.build { t ->
    println("DEBUG:" + t.name)
}

实际上,您可以调用
org.gradle.api.tasks.TaskContainer#create(java.util.Map,groovy.lang.Closure)
并创建一个名为
build
rootProject的新任务。getAllTasks(true)
看起来它检索的任务比
rootProject.tasks
多。tasks
创建一个新任务的观点很好。我忘了那会发生。然而,这并不能回答我如何获得所有任务的列表的问题……通常构建任务是通过应用插件(例如java或groovy插件)注入gradle构建过程的。我相信这是正确的答案
rootProject.getAllTasks(true)
返回从项目实例到任务实例的映射,它似乎返回所有任务,包括
build
之类的任务,这些任务是由
java
groovy
之类的插件注入的。