美文网首页项目构建
Gradle Task 入门 8 TaskExecutionGr

Gradle Task 入门 8 TaskExecutionGr

作者: 这个世界是虚拟的 | 来源:发表于2020-08-07 14:11 被阅读0次

需求

假设我需要在执行release 任务时先查看一下配置文件中版本定义是否为release true (release=true), 如果不是true那么将其设定为ture并执行release

需求分析

这里貌似可以添加一个rule,代码类似

tasks.addRule("do when calling release") {
    String taskName ->
        if (taskName.startsWith('release')) {
            logger.quiet 'applying rule to the task'
            // set release=true
           //  do more things ... ..
        }
}

但是如果我们需要代码更加规整抽象化,此时便可以考虑监听task的执行,这时我们便可以考虑TaskExecutionGraph

TaskExecutionGraph

Gradle 在execution阶段需要生成一个执行顺序图DAG,也就是一个有向无环的顺序结构,每一个taks是图的一个节点,当此图生成后,TaskExecutionGraph的whenReady就会被调用,同时也提供了addTaskExecutionListener方法来注册监听task,二者都可以实现需求,其实TaskExecutionGraph还提供了多种对task生命周期上加入操作的方法:Interface TaskExecutionGraph

image.png

实现

可以看出TaskExecutionGraph提供了很多方便我们使用的API接口,我们只需要调用维护,这个例子我们来注册一个listener

class ReleaseVersionListener implements TaskExecutionGraphListener {

    final static String releaseTaskPath = ':release'
    final static String buildTaskPath = ':build'

    @Override
    void graphPopulated(TaskExecutionGraph taskExecutionGraph) {

        if (taskExecutionGraph.hasTask(buildTaskPath)) {
            println "doing build ... ..."
        }

        if (taskExecutionGraph.hasTask(releaseTaskPath)) {
           //通过taskExecutionGraph获得所有的task
            List<Task> allTasks = taskExecutionGraph.allTasks
            Task releaseTask = allTasks.find {
                it.path == releaseTaskPath
            }
            //通过task 获得project, 以取得project 的属性
            Project project = releaseTask.project
            if (!project.ext.myNewTag.release){
                project.ext.myNewTag.release = true
                Properties properties = new Properties()
                project.ext.myTagFile.withInputStream {
                    stream -> properties.load(stream)
                }
                println properties.prefix.toString()

                properties.setProperty('prefix', 'releaseVersionListener-prefix')
                properties.setProperty('postfix', 'releaseVersionListener-postfix')
                properties.setProperty('release', 'true')

                println ".... ....... ..........."
                println properties.prefix.toString()
                }
            }
        }
    }
}

实现逻辑很简单,当任务执行图生成后,查看配置,如果release = false 就开始搞事,这里我也测试了build,同样也是可以的

执行

//D:\code\gradleTuto>gradlew release
...
.... ....... ...........
releaseVersionListener-prefix
...

相关文章

  • Gradle Task 入门 8 TaskExecutionGr

    需求 假设我需要在执行release 任务时先查看一下配置文件中版本定义是否为release true (rele...

  • gradle task入门

    gradle task入门 //源码来自w3cschool https://www.w3cschool.cn/gr...

  • Gradle快速入门

    Gradle快速入门创建Task的多种方法读懂Gradle语法增量式构建自定义Property使用java Plu...

  • Gradle Task 入门 1

    Task 在哪? Task 简单使用 声明Task 定义一个Task, 并打印版本 另一种定义方法,这里需要注意的...

  • Gradle学习

    Gradle基础 1、Task 在Gradle中一个原子性的操作叫做task,可以简单理解为task是Gradle...

  • Gradle:Task # finalizedBy()

    Gradle:Task # finalizedBy() 这篇文章对Gradle的Task对象的finalizedB...

  • Gradle Task 入门 5 定制化task

    需求 我们这个task就是修改配置文件并保存,我们将使用自己定义的task来实现这个需求 定义Task类 继续沿用...

  • Gradle Task 学习

    Task Task是Gradle中的最小执行单元,要学gradle那么对Task必须要了解先看一下 Task的构造...

  • Idea插件开发中使用ProGuard混淆代码

    配置gradle插件 gradle配置ProGuard插件 添加混淆task 配置task依赖关系 配置混淆文件 ...

  • gradle task简单使用方法

    gradle命令 语法:gradle task名称gradle build:执行build任务gradle -m ...

网友评论

    本文标题:Gradle Task 入门 8 TaskExecutionGr

    本文链接:https://www.haomeiwen.com/subject/fxiprktx.html