学习写Gradle构建脚本(一)

来源:互联网 发布:mac chrome书签位置 编辑:程序博客网 时间:2024/06/06 01:06

文章内容来自Gradle官方的user-guide文档

构建脚本的基本内容

工程(projects)和任务(tasks)

每一个构建脚本都是由一个或者多个工程组成。
一个工程由一个或多个任务组成。

一个HelloWorld工程

gradle 命令会去寻找当前目录的build.gradle文件,这个文件就是我们的构建脚本。
我们到一个空目录下,新建一个build.gradle文件,输入如下内容

task hello {    doLast {    println 'Hello World!'    }}

在命令行里输入 gradle -q hello 就会看见输出如下内容:

Hello World!

-q 的意思是 quiet,即不输出任何的日志,直接输出任务相关的内容。
上面的 build.gradle 就定义了一个hello任务, 在任务里面添加一个动作,
动作执行一段代码,就是输出 Hello World! 。当执行 gradle -q hello 时,
Gradle会执行hello任务。

一个简化的任务定义

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

<<操作符类似于doLast的别名

构建脚本实际上是代码

Gradle的构建脚本能够使用Groovy语言的所有强大功能。如:

task count {    doLast {    4.times { print "$it " }    }}

gradle -q count

0 1 2 3

任务之间的依赖

taskX依赖taskY的声明方式

task taskX(dependsOn: 'taskY') << {    println 'Task X'}task taskY << {    println 'Task Y'}

taskX依赖taskY,但是taskY还没有声明,这是一种延迟依赖(Lazy dependsOn)。
输出如下,先执行依赖的任务

gradle -q taskX

Task X

Task Y

动态任务

利用Groovy动态创建任务

4.times { counter ->    task "task$counter" {    doLast {        println "I'm task number $counter"     }    }}

可以动态创建task1-task4

gradle -q task3

I’m task number 3

操作存在的任务

任务被创建后就可以通过API访问。可以动态的添加依赖

4.times { counter ->    task "task$counter" {    doLast {        println "I'm task number $counter"    }    }}task0.dependsOn task2, task3

gradle -q task0
I’m task number 2
I’m task number 3
I’m task number 0

简短的记号

有一些很方便的记号能够访问一个存在的任务。没一个任务可以作为构建脚本的属性。

task notation {    doLast {    println 'Hello World!'    }}notation.doLast {    println 'This is $notation.name task!'}

gradle -q notation
Hello World!
This is $notation.name task!

自定义的项目属性

可以给任务添加自己的属性。

task myProperty {    ext.time = "time is now" }task printMyProperty {    doLast {    println myProperty.time    }}

gradle -q printMyProperty

time is now

使用Ant任务

Gradle很好的集成了Ant任务通过简单的依赖Groovy。通过Gradle使用Ant任务是更加强大和方便。
下面这个例子介绍了怎样执行Ant任务和怎样访问Ant属性。

task loadfile {    doLast {    def files = file('.').listFiles().sort()    files.each { File file ->        if (file.isFile()) {        ant.loadfile(srcFile : file, property: file.name)        println " *** $file.name ***"        println "${ant.properties[file.name]}"        }    }    }}

当前目录只有build.gradle,所以输出如下

* build.gradle *

task loadfile {

doLast {

def files = file(‘.’).listFiles().sort()

files.each { File file ->

if (file.isFile()) {

ant.loadfile(srcFile : file, property: file.name)

println ” * $file.name *

println “${ant.properties[file.name]}”

}

}

}

}

更多的Ant的操作会在后面介绍

方法的使用

Gradle定义方法来组织逻辑。

task checksum {    doLast {    fileList('.').each { File file ->        ant.checksum(file: file, property: "cs_$file.name")        println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"    }    }}task loadfile {    doLast {    fileList('.').each { File file ->        ant.loadfile(srcFile: file, property: file.name)        println "I'm fond of $file.name"    }    }}File[] fileList(String dir) {    file(dir).listFiles({file -> file.isFile() } as FileFilter).sort()}

默认任务

Gradle可以定义一个或多个任务,如果没有其他的任务被指定,默认任务就会执行。

defaultTasks 'clean', 'run'task clean {    doLast {    println 'Default Cleaning!'    }}task run {    doLast {    println 'Default Running!'    }}task other {    doLast {    println "I'm not a default task!"    }}

gradle -q

Default Cleaning!

Default Running!

通过DAG配置

Gradle有一个配置解析期(configuration phase)和一个执行解析期(execution phase)。
在配置解析完成后,Gradle知道了所有应该被执行的任务。为了使用这些信息,Gradle
提过了一个钩子(hook)。这样我们就可以给变量不同的值。

下面的例子中,version变量的值取决于执行的任务是哪个。

task distribution {    doLast {    println "We build the zip with version=$version"    }}task release(dependsOn: 'distribution') {    doLast {    println "We release now"    }}gradle.taskGraph.whenReady { taskGraph ->     if (taskGraph.hasTask(release)) {    version = 1.0    } else {    version = '1.0-SNAPSHOT'    }}

不同的执行结果如下

gradle -q distribution

We build the zip with version=1.0-SNAPSHOT

gradle -q release

We build the zip with version=1.0

We release now

whenReady 影响 release 任务在 release 任务执行之前。

接下来将会介绍更详细的Gradle的内容。

原创粉丝点击