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

实现
可以看出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
...
网友评论