为何要挂接到生命周期
有时候当一个特定的生命周期事件发生时,可能需要执行代码;一个生命周期事件可能发生在某个构建阶段之前、期间或之后;
如想在开发周期中尽可能早的获得失败构建的反馈信息,就可以编写回调生命周期事件,监听构建生命周期事件,比如:构建失败,发送邮件等内容;
许多生命周期回调放在定义在Project和Gradle接口中;
Task执行图的内部展示
在配置时,gradle决定在执行阶段要运行的task顺序,表示依赖关系的内部结构被建模为一个有向无环图(DAG);图中的每一个task被称为一个节点,并且每个节点通过有向边连接起来;
挂接到生命周期
编写task可改变项目版本,如之前的一些例子,也可以通过编写生命周期钩子实现同样的目标;
当task图生成完成后,TaskExecutionGraph提供的whenReady方法会被调用
在生命周期的方法中,添加钩子(task生成好之后,立即执行闭包代码):
通过生命周期钩子实现发布版本功能:
// 添加钩子,设置配置文件
gradle.taskGraph.whenReady { TaskExecutionGraph taskGraph ->
if (taskGraph.hasTask(makeReleaseVersion)) {
if (!version.release) {
version.release = true
ant.propertyfile(file: versionFile) {
entry(key: 'release', type: 'string', operation: '=', value: 'true')
}
}
}
}
实现task执行图监听器
通过监听器挂接到构建生命周期有2个步骤:通过在构建脚本中编写类来实现特定的监听器接口 与 注册监听器实现;
监听 task 执行图事件的接口由 TaskExecutionGraphListener
接口提供;
// 实现发布版本,并且次要版本 + 1
class ReleaseVersionPlusListener implements TaskExecutionGraphListener {
// task路径需要为 :模块名:task名
final static String releaseTaskPath = ":common:makeReleaseVersion"
@Override
void graphPopulated(TaskExecutionGraph taskGraph) {
// 是否包含在执行图中
if (taskGraph.hasTask(releaseTaskPath)) {
List<Task> allTasks = taskGraph.getAllTasks();
Task releaseTask = allTasks.find { it.path == releaseTaskPath }
Project project = releaseTask.project // task 对应的 project
// 注意这里需要添加 project,因为这里是单独的类,
// 需要由task拿其对应的project实例
if (!project.version.release) {
project.version.release = true
project.ant.propertyfile(file: project.versionFile) {
entry(key: 'release', type: 'string', operation: '=', value: 'true')
}
project.ant.propertyfile(file: project.versionFile) {
entry(key: 'minor', type: 'int', operation: '+', value: 1)
}
}
}
}
}
添加监听
// --------------------------- 监听生命周期,实现发布版本,并+1 ---------------------------
// 注册监听器到task执行图
def releaseListener = new ReleaseVersionPlusListener()
gradle.taskGraph.addTaskExecutionGraphListener(releaseListener)