体验Gradle(6):初始化脚本

跟doFirst和任务外的脚本不同,初始化脚本是针对所有Gradle工程起作用的脚本,而前者的作用对象是Task和单个工程。因此利用初始化脚本,我们可以完成一些面向整个Gradle构建环境的动作。就像mrhaki的做法,实现并安装自定义的BuildAdapter

这个BuildAdapter的作用很简单,它结合Snarl(一种通知服务工具,下载)和Snarl_CMD(可以发送Snarl通知的命令行工具,下载),使得每次构建成功和失败都显示相应的通知信息。由于用到了初始化脚本,这一特性令所有Gradle构建都得以享受,而不用作任何调整。以下是mrhaki的做法:

  • 实现init.gradle,并将它置于%USER_HOME%/.gradle目录下。
  • 在init.gradle里面实现一个BuilderAdapter的子类,并安装。
  • class SnarlNotifyListener extends BuildAdapter {
        void buildFinished(BuildResult result) {
            if (result.failure) {
                snarlNotify 'Gradle build failure', result.failure.message, true
            } else {
                snarlNotify 'Gradle build finished', 'Build successful'
            }
        }
    
        void snarlNotify(title, message = 'No message', sticky = false) {
            def cmd = [
                'Snarl_CMD.exe的目录',  // Replace with your local path.
                'snShowMessage',
                sticky ? '0' : '10',  // If non-sticky display for 10 seconds.
                title,
                message,
                '%GRADLE_HOME%/docs/groovydoc/groovy.ico'  // Nice little icon, use local path.
            ]
            cmd.execute()
        }    
    }
    def listener = new SnarlNotifyListener()
    gradle.addBuildListener listener
    

实现上述步骤之后,每当你运行Gradle的任务,不论成功还是失败,snarl都会显示相应的消息。当然,在享受它之前,别忘了先去安装Snarl和Snarl_CMD。

mrhaki的做法只是实现初始化脚本的一种做法,还有一种做法就是利用命令行参数--init-script指出初始化脚本的路径:

gradle --init-script init.gradle

有时,你可能会想在初始化脚本里面使用外部类,这时需要先指出相应的classpath,这就要用到initscript。在初始化脚本里声明

initscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath group: 'org.apache.commons', name: 'commons-math', version: '2.0'
    }
}

之后,你就可以在脚本里使用其中声明的类了。

在使用初始化脚本的时候,需要记住它的一个约束:无法引用工程buildSrc里的任何类。这不奇怪,因为初始化脚本的运行是在任何构建之前,而此时的构建根本还未解析。

最后,说句题外话,在Gradle 0.9里面,已经有了一个Announce插件,它可以从你的构建里面向twitter、snarl、libnotify或growl发送通知。详情可以访问0.9的发布说明,但请注意,Gradle 0.9尚未正式发布,目前0.9发布的是第三预览版(0.9-preview-3),该说明目前还处于草稿状态。


本系列的其它部分:

By foxgem - Posted on 21 七月 2010