美文网首页
Gradle实战读书笔记之二 构建块-挂接到生命周期

Gradle实战读书笔记之二 构建块-挂接到生命周期

作者: zhaoyubetter | 来源:发表于2017-09-08 16:24 被阅读14次

为何要挂接到生命周期

有时候当一个特定的生命周期事件发生时,可能需要执行代码;一个生命周期事件可能发生在某个构建阶段之前、期间或之后;
如想在开发周期中尽可能早的获得失败构建的反馈信息,就可以编写回调生命周期事件,监听构建生命周期事件,比如:构建失败,发送邮件等内容;

构建生命周期钩子示例

许多生命周期回调放在定义在Project和Gradle接口中;

Task执行图的内部展示

在配置时,gradle决定在执行阶段要运行的task顺序,表示依赖关系的内部结构被建模为一个有向无环图(DAG);图中的每一个task被称为一个节点,并且每个节点通过有向边连接起来;

task依赖关系通过DAG表示出来

挂接到生命周期

编写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)

相关文章

网友评论

      本文标题:Gradle实战读书笔记之二 构建块-挂接到生命周期

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