美文网首页项目构建
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

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