学习写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的内容。
- 学习写Gradle构建脚本(一)
- Gradle学习笔记(二)构建脚本
- gradle学习(11)-编写构建脚本
- gradle学习笔记(一) 构建工具介绍
- Gradle学习-构建Java程序一
- Gradle:构建脚本概要
- Gradle构建脚本基础
- gradle学习(一)
- gradle学习(一)
- 《gradle教程系列》二.构建gradle脚本
- Gradle之构建脚本入门
- Gradle笔记2-构建脚本
- Android Studio Gradle构建脚本
- 学习Gradle构建Android
- android之gradle构建工具学习之路(一)
- linux shell脚本学习笔记一 脚本文件的构建
- Gradle学习笔记(一)
- Gradle学习笔记(一)
- 欢迎使用CSDN-markdown编辑器
- Python编程从入门到实践:习题4-13
- 【linux】常见指令---day 1
- Session实现购物车功能(八)
- linux安装MYSQL
- 学习写Gradle构建脚本(一)
- 理解java中的final关键字个人笔记
- 欢迎使用CSDN-markdown编辑器
- 暴力的算法
- Git命令使用笔记
- HDU 2845(动态规划-最大非连续区间)
- 管道符 & 环境变量
- Docker(二) 镜像详解
- DButils工具中重要的类与接口 讲解 后续持续更新