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