学习写Gradle构建脚本(一)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值