【问题标题】:Getting a list of all Gradle tasks from build script从构建脚本中获取所有 Gradle 任务的列表
【发布时间】:2017-08-13 16:54:37
【问题描述】:

所以我正在尝试将所有 gradle 任务的列表写入文件。我当然可以为此使用tasks 命令,但我希望每次调用任何 other gradle 命令时都将其缓存到文件中。因此,每当我运行 ./gradlew build 时,我都希望将可用任务写入文件。

这看起来很简单,我写了下面的任务来尝试一下:

task cacheTasks() {
    doLast {
        allprojects { p ->
            p.tasks*.each { t ->
                println(p.name + ":" + t.name)
            }
        }
    }
}

问题是,我只得到所有可用任务的子集。当我运行./gradlew tasks --all 命令时,会打印更多内容。当我遍历它时,似乎没有任何内置任务(如buildcleanhelp)在tasks* 列表中,但奇怪的是我可以参考他们直接:

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

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

【问题讨论】:

    标签: gradle groovy build.gradle


    【解决方案1】:

    我非常怀疑容器中是否存在名称为 build 的任务类。

    这是我在调试您的任务时得到的:


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

    使用时

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

    您实际上调用了org.gradle.api.tasks.TaskContainer#create(java.util.Map<java.lang.String,?>, groovy.lang.Closure) 并创建了一个名为build 的新任务。

    【讨论】:

    • 很好,tasks.build 创建了一个新任务。我忘了那会发生。但是,这并不能回答我如何获得所有任务列表的问题......
    • 通常构建任务通过应用插件注入到 gradle 构建过程中,例如 java 或 groovy 插件。
    【解决方案2】:

    rootProject.getAllTasks(true) 似乎检索的任务比rootProject.tasks 多。

    【讨论】:

    • 我相信这是正确的答案。 rootProject.getAllTasks(true) 返回一个从项目实例到任务实例的映射,它似乎返回了所有任务,包括 build 之类的任务,这些任务已由 javagroovy 等插件注入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2013-09-13
    相关资源
    最近更新 更多