Gradle Task 入门 8 TaskExecutionGraphLinstener

需求

假设我需要在执行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 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 TaskExecutionGraphLinstener)