需求
假設(shè)我需要在執(zhí)行release 任務(wù)時(shí)先查看一下配置文件中版本定義是否為release true (release=true), 如果不是true那么將其設(shè)定為ture并執(zhí)行release
需求分析
這里貌似可以添加一個(gè)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 ... ..
}
}
但是如果我們需要代碼更加規(guī)整抽象化率拒,此時(shí)便可以考慮監(jiān)聽task的執(zhí)行猬膨,這時(shí)我們便可以考慮TaskExecutionGraph
TaskExecutionGraph
Gradle 在execution階段需要生成一個(gè)執(zhí)行順序圖DAG呛伴,也就是一個(gè)有向無環(huán)的順序結(jié)構(gòu),每一個(gè)taks是圖的一個(gè)節(jié)點(diǎn)热康,當(dāng)此圖生成后,TaskExecutionGraph的whenReady就會(huì)被調(diào)用污它,同時(shí)也提供了addTaskExecutionListener方法來注冊(cè)監(jiān)聽task庶弃,二者都可以實(shí)現(xiàn)需求,其實(shí)TaskExecutionGraph還提供了多種對(duì)task生命周期上加入操作的方法:Interface TaskExecutionGraph
實(shí)現(xiàn)
可以看出TaskExecutionGraph提供了很多方便我們使用的API接口固惯,我們只需要調(diào)用維護(hù)葬毫,這個(gè)例子我們來注冊(cè)一個(gè)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()
}
}
}
}
}
實(shí)現(xiàn)邏輯很簡單贴捡,當(dāng)任務(wù)執(zhí)行圖生成后村砂,查看配置,如果release = false 就開始搞事,這里我也測(cè)試了build罕模,同樣也是可以的
執(zhí)行
//D:\code\gradleTuto>gradlew release
...
.... ....... ...........
releaseVersionListener-prefix
...