Gradle 入门

最开始为了调研多渠道打包来到过这个 后来Google出了AndroidStudio 所以又研究了一下~

Quick Start

下载Gradle之后添加到环境变量

C:\Users\Administrator>gradle --version

------------------------------------------------------------
Gradle 1.7
------------------------------------------------------------

Build time:   2013-08-06 11:19:56 UTC
Build number: none
Revision:     9a7199efaf72c620b33f9767874f0ebced135d83

Groovy:       1.8.6
Ant:          Apache Ant(TM) version 1.8.4 compiled on May 22 2012
Ivy:          2.2.0
JVM:          1.7.0_17 (Oracle Corporation 23.7-b01)
OS:           Windows 7 6.1 amd64

这样算是安装成功了,Gradle是通过任务(Task)的方式来管理工程的,Gradle的默认文件名是 build.gradle 一个HelloWorld任务如下

//build.gradle
task hello {
    println 'Hello world!'
}

执行 gradle hello 会打印:

C:\Users\Administrator>gradle hello
Hello world!
:hello UP-TO-DATE

BUILD SUCCESSFUL

gradle hello 是告诉Gradle执行 hello 这个任务,如果没有指定文件名,Gradle会默认执行 build.gradle 中定义的任务.你可能注意到 println 'Hello world!' 这是一条Groovy的语句,在Gradle的文件中可以直接写Groovy脚本(Groovy 是兼容java的),所以可以直接写出 println 'it's a string' 这样的语句。

更复杂一点,引用一个java插件,java插件会预定一系列任务,可以直接调用或者组合这些任务来构造更复杂的任务。

工程目录:

D:.
├─src
│  └─Test.java
└─build.gradle

build.gradle

//build.gradle
//引用Gradle的java插件
apply plugin: 'java'
//设置兼容Java5
sourceCompatibility = 1.5
//输出jar包版本
version = '1.0'

buildscript {
    repositories {
        //依赖管理这个待会再看
        mavenCentral()
    }
}

sourceSets {
    main {
        java {
            //源码路径,我用的是Eclipse工程
            srcDir 'src'
        }
    }
}

首先 apply plugin: 'java' 这样就可以引用java插件,然后设置依赖管理,如果没有指定源码的路径,Java插件会默认到 main/java/**下寻找源码,我用的Eclipse配置所以手动设置了源码的路径在根目录的 src , 执行 gradle jar发现会多了一个目录 build 里面增加了几个文件和目录,这是因为jar是java插件的一个任务,执行这个任务之后会编译源码并导出jar包。

D:.
├─.gradle
│  └─1.7
│      └─taskArtifacts
├─.settings
├─build
│  ├─classes
│  │  └─main
│  ├─dependency-cache
│  ├─libs
│  └─tmp
│      └─jar
└─src

Java 插件

还记得这句话吗 mavenCentral() 它是告诉Gradle要去这个地方寻找依赖, 这是Maven的CentralRepo 添加依赖更简单

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
}

这样工程编译的时候就会自动到 maven central 上寻找commons-collections-3.2.jar 这个依赖。有些时候依赖的包可能不在Maven Central或者 其他的托管服务器上(比如Apache IVY、Bintray等),需要设置本地依赖,最常见的就是在工程下放一个 libs 目录用来存放第三方依赖,配置本地依赖同样简单

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    compile fileTree(dir: 'libs', include:['*.jar'])
}

那么如何调度任务呢?

任务依赖,一个很复杂的任务可以分解成很多串联的小任务来完成,任务相互依赖就可以一次完成整个任务了

task hello {
	println 'hello'
}

task world(dependsOn: hello){
	println 'world'
}

执行 gradle world

hello
world
:hello UP-TO-DATE
:world UP-TO-DATE

BUILD SUCCESSFUL

如果依赖多个任务可以这么写:dependsOn:[task1, task2, task3…]

配置已有任务,对于大多数情况下任务都是类似或者重复的比如把java源码编译成 class 文件打成jar包,这样的任务Java插件都是默认提供的 或者把文件(夹)从A复制到B,对于我们来说只要做一些简单的配置就可以完成我们需要的功能,比如Copy这样的任务

task myCopy(type: Copy){
   from 'resources'
   into 'target'
   include('**/*.txt', '**/*.xml', '**/*.properties') //设置一些过滤条件
}

通过任务配置和任务依赖可以组合出非常复杂的功能。

配置本地插件

使用java插件只需要 apply plugin: ‘java’ 就行了,在目前为止Gradle并没有集成Proguard功能或者有Proguard插件可以使用,如果需要使用需要自己配置,

buildscript {
    repositories {
        //配置Maven central
        mavenCentral()
        //配置本地搜索目录
        flatDir dirs: 'scripts/tools' //config proguard location
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
        //配置Proguard插件
        classpath ':proguard'
    }
	}
}

定义一个函数

task bar(){
	foo()
}

public void foo(){
	println 'fooooo'
}

是不是很惊艳,可以直接在Gradle的文件中写函数执行~~~

At last

仅作记录方便回忆,Gradle官方提供的文档非常全面

  1. 使用指南 Gradle入门相关
  2. DSL Gradle定义的基础任务
  3. JavaDoc java 文档
  4. GroovyDoc Groovy 文档
  5. Gradle 语法解释
nTop 07 November 2014
blog comments powered by Disqus