体验Gradle(2):基础

看过一个实际的Groovy工程样板之后,是时候了解一些基础知识了。

首先是下载安装,这个并没有什么新鲜的东西:

  • 下载:地址
  • 解压并设置你的环境变量:GRADLE_HOME=你的解压路径,确保path中包含了%GRADLE_HOME%/bin
  • 测试安装成功,在命令行输入:gradle。

其次是如何在工程中使用:

  • 创建工程目录,大多数情况下,遵循惯例是最简单的做法。前文已经列出了Java插件和Groovy插件的惯例,不了解或者是忘了的,请移步观之。
  • 在工程的根目录,创建build.gradle,这一点类似ant。
  • 运行定义在build.gradle中的任务:gradle 任务。

现在该说说重点了:构建脚本。前文说过,Gradle的构建脚本实际是groovy代码,其核心task,就是groovy中的闭包。在本系列开篇的例子中已经展示了它的写法。但是,为了遵循老传统,这里还是再啰嗦一下(摘自Gradle的用户指南):

task hello << {
    println 'Hello world!'
}

运行:gradle hello。

在任务中,你可以向平常一样书写groovy代码,同时还可以使用gradle内置对象及其方法,象前文的ant以及captureStandardOutput方法,都属此类。

和ant一样,task之间可以有依赖关系,被依赖的先运行,然后才是依赖者。通过dependsOn属性来指定:task run(dependsOn: classes){……}。

任务一旦定义之后,你便可以象使用其它变量一样使用它,这充分体现了gradle的动态性。如上例,你可以直接使用hello来引用那个任务,它的类型是Task。你可以给它添加属性和行为,以备后用。如果你想在任务的执行前后做点小动作,doFirst和doLast是你最好的选择(摘自Gradle的用户指南):

    task hello << {
        println 'Hello Earth'
    }
    hello.doFirst {
        println 'Hello Venus'
    }
    hello.doLast {
        println 'Hello Mars'
    }
    hello << {
        println 'Hello Jupiter'
    }

最后一个相当于直接给doLast添加。此外,如果是对整个工程而言,而非对单个任务,那么你可以直接在build.gradle中书写groovy脚本。这种做法,相当于全局的doFirst。以下摘自我的Android工程的gradle文件,每次build前删除工程中的.bak。原因是,对于资源文件,Android似乎不加区别的对该目录(res)下的所有文件进行处理,而不是判断其是否为xml文件。而象UE这样的文本编辑器的一个特性是对修改文件产生一个.bak,这就导致Android发现重复的资源id。而我觉得这个UE特性有时还是有用的,不想设成关闭。所以就采用了“特事特办”的做法:

ant.echo 'delete .bak files ...'
ant.delete{
    fileset(dir:'.', includes:'**/*.bak')
}

以上代码完全在任何task之外。

到现在为止,各位应该看出ant在gradle中的重要性,这让我们依旧还可以利用之前的ant经验。但能否直接利用ant的build逻辑呢?这个,完全不成问题。只消一句话即可。下面的代码同样摘自我的Android工程的gradle文件:

ant.importBuild 'build.xml'

这里顺便再说些题外话。如果使用Eclipse的Android插件进行开发,创建工程并不会出现这个build.xml。但是如果你完全使用命令行方式,即使有“android create project”,则就会出现。以上做法是直接向工程引入gradle的最简方式,即享受了gradle的好处,也不必对原来的东西大动干戈。现在启动模拟器,然后输入“gradle install”,便可向其中加载你的Android应用了。

其它一些值得注意的技巧:

  • 动态创建任务(摘自Gradle的用户指南):
  • 4.times { counter ->
        task "task$counter" << {
            println "I'm task number $counter"
        }
    }
    
  • 缺省任务,这个根ant的概念类似:defaultTasks 'clean', 'run'
  • 利用ant来使用ant任务,本文已多次提及
  • 利用方法来组织构建逻辑,抽出公共的部分

本系列的其它部分:

By foxgem - Posted on 13 五月 2010

版本

应该说明用的是什么版本的Gradle,因为Gradle的API还没稳定下来,版本于版本之间的API还是有一些区别的 

gradle 0.8

谢谢提醒,目前0.9尚未正式发布,本系列都是以0.8为准。