文章内容来自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的内容。