美文网首页
Gradle学习6——挂接到构建生命周期

Gradle学习6——挂接到构建生命周期

作者: sososeen09 | 来源:发表于2017-10-14 16:52 被阅读124次

    学习本系列前可以下载相关的github项目gradleLearnDemo
    地址:https://github.com/sososeen09/gradleLearnDemo

    之前已经讲了Gradle的构建生命周期阶段,当我们在编写构建脚本的时候,可能不仅限于编写不同构建阶段执行的task工作或者配置逻辑。有的时候当一个特定的生命周期事件或者task执行的时候,你想要执行一些代码。这个时候我们就可以根据回调生命周期事件来处理我们需要的逻辑。

    有两种方式编写回调生命周期事件:在闭包中或者通过Gradle API所提供的监听器接口实现。
    选择哪种方式都可以,这个就看个人选择了。
    采用监听器实现最大的优势在于你处理的类通过编写单元测试是完全可测试的。
    下面展示了一个hook 构建生命周期的示意图。

    hook生命周期.png

    许多生命周期回调方法被定义在Project和Gradle接口中。

    1 挂接到task执行图

    我们之前讲的例子是通过一个task来将配置文件中的release变为true,现在,我们编写一个生命周期钩子可以实现同样的目标。因为构建确切的知道task在得到执行之前哪些将参与构建,假设当我们的脚本文件build.gradle中如果有releaseProject 这个task的话,我们就把release 变为true。

    task releaseProject << {
        logger.quiet 'Releasing the project...'
    }
    
    gradle.taskGraph.whenReady{TaskExecutionGraph taskGraph ->
      //注册的生命周期钩子在task图生成后被调用
      //查看执行图中是否包含task releaseProject
      if(taskGraph.hasTask(releaseProject)){
         if(!version.release){
           version.release=true
           ant.propertyfile(file:versionFile){
             entry(key:'release',type:'string',operation:'=',value: 'true')
           }
         }
      }
    }
    

    然后执行任何一个能够触发releaseProject任务的命令,比如gradle releaseProject,这个时候releaseProject 这个task就被添加到task执行图中了,当task执行图生成完成后,TaskExecutionGraph 这个类提供的 whenReady 方法会被调用。

    2 实现task执行图监听器

    通过监听器挂接到构建生命周期只需要两个简单的步骤:

    • 通过在构建脚本中编写一个类实现特定的监听器接口
    • 注册监听器实现

    用于监听task执行图事件的接口是由TaskExecutionGraphListener接口提供的。
    监听器可以通过通用的addListener方法或者指定监听器类型实例的方法进行注册。

    有一点要指出,在我们自定义的监听器中,是不可以直接访问构建脚本的Project实例的。我们可以根据Task类的getProject()方法来获得该task所在的Project实例。

    class ReleaseVersionListener implements TaskExecutionGraphListener {
        final static String releaseTaskPath = ':releaseProject'
    
        @Override
        void graphPopulated(TaskExecutionGraph taskGraph) {
          // 确定releaseProject task 是否包含在执行图中
            if (taskGraph.hasTask(releaseTaskPath)) {
                List<Task> allTasks = taskGraph.allTasks
                // 从执行图中的所有task来找到releaseProject 的 task 实例
                Task releaseTask = allTasks.find { it.path == releaseTaskPath }
                // 每个task都知道自己所属的project
                Project project = releaseTask.project
    
                if (!project.version.release) {
                    project.version.release = true
                    project.ant.propertyfile(file: project.versionFile) {
                        entry(key: 'release', type: 'string', operation: '=', value: 'true')
                    }
                }
            }
        }
    }
    
    // 注册监听器到task执行图中
    gradle.taskGraph.addTaskExecutionGraphListener(new ReleaseVersionListener())
    

    3 总结

    我们上面介绍了挂接到构建生命周期的两种方式,这些都是在构建脚本中进行的。但实际上并不局限于在构建脚本中注册生命周期监听器。在任何task执行之前,都可以应用生命周期逻辑来监听Gradle事件,比如在初始化脚本中也可以来挂接到构建生命周期,这部分内容我们就不介绍了,有兴趣的可以自行搜索。

    下一篇,我们开始学习编写和使用自定义Task。

    相关文章

      网友评论

          本文标题:Gradle学习6——挂接到构建生命周期

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