Gradle系列之构建脚本基础
原文发于微信公众号 jzman-blog,欢迎关注交流。
前面两篇文章分别介绍了 Gradle 基础知识以及 Groovy 相关基础知识,这也是学习 Gradle 所必需了解的,文章链接如下::
本文将对 Gradle 整体进行了介绍和学习,了解了 Task、Project 等相关概念以及对使用 Gradle 来构建项目的一些常用操作,主要内容如下:
- Setting 文件
- Build 文件
- Project 和 Tasks
- 任务的创建
- 任务依赖
- 任务间的交互
- 自定义属性
- 总结
Setting 文件
说一下 Gradle 构建项目的 Setting 文件,该文件主要用来配置当前工程,比如 Android 开发中一个项目中可能有多个子 Module,当不需要某个子 Module 时,可以取消该 Module 在配置文件 Setting 中的配置即可,当然只有在 Setting 文件中配置的子 Module 才会被构建,当然不只是 Android 开发,只要使用 Gradle 构建的项目都一样,Setting 是 Gradle 构建项目默认的配置文件名,下面简单测试一下 Setting.gradle 文件的使用,测试工程目录如下:
├─GradleSetting
│ ├─.gradle
│ │ ├─4.1
│ │ │ ├─fileChanges
│ │ │ ├─fileHashes
│ │ │ └─taskHistory
│ │ └─buildOutputCleanup
│ └─test
│ └─Method
│ └─.gradle
│ ├─4.1
│ │ ├─fileChanges
│ │ ├─fileHashes
│ │ └─taskHistory
│ └─buildOutputCleanup
│ build.gradle
│ setting.gradle
在工程名为 GradleSetting 的工程中 test 文件夹下有一个 Method 的子项目,这里会通过配置 setting.gradle 文件将子项目 Method 构建到 GradleSetting 中,setting.gradle 文件内容如下:
println "---------test----Setting.gradle----------"
//输出当前工程目录
println(rootDir)
//指定要参与构建的子项目
include ':Method'
project(':Method').projectDir = new File(rootDir,'test/Method')
来看一下输出结果:
PS E:\Gradle\study\GradleSetting> gradle testGradleSetting
---------test----Setting.gradle----------
E:\Gradle\study\GradleSetting
> Configure project :
testGradleSetting
> Configure project :Method
3
3
30
获取方法返回的结果:30
1
2
3
4
5
BUILD SUCCESSFUL in 2s
因为在 setting.gradle 文件中配置了 Method,从输出结果看 Method 确实参与了构建,取消在 setting.gradle 文件中的配置,则不会构建 Method,最好自己验证一下。
上面配置了子项目 Method 所在的位置,如果不指定则默认是与 setting.gradle 同级的目录。
Build 文件
如果选择使用 Gradle 构建项目,则每个项目都有一个 build.gradle 文件,该文件是项目构建的入口,对整个项目的配置生效,可以在根项目配置子项目的一下通用配置,比如配置子项目的仓库为 jcenter,这样子项目中所有的依赖就指向 jcenter 中心库下载,下面是参考代码:
//配置子项目依赖的仓库
subprojects{
repositories{
jcenter()
}
}
//配置全部项目
allprojects{
}
...
通过本小节主要了解 build.gradle 文件的作用即可,实际开发中针对不同类型的项目会有更详细的相应配置策略。
Project 和 Tasks
在 Gradle 中有很多 Project,可将某个 Project 打包成 jar 提供给另一个 Project 使用,每个 Project 都是根据其业务需求抽象出来的一个子模块,最终通过 Gradle 构建成完整的项目。
每个 Project 允许有多个 task,Task 理解为任务,task 主要 完成某个具体的功能点,比如 wrapper task 主要就是完成 wrapper 文件的创建。
任务的创建
对于任务的创建已经比较熟悉了,下面使用 task 声明一个任务:
//1. 创建一个任务
task createTask{
doFirst{
println 'doFirst'
}
doLast{
println 'doLast'
}
}
//2. 使用TaskContainer创建一个任务,Project已经定义的TaskContainer,即tasks
tasks.create("createTask1"){
doFirst{
println 'doFirst'
}
doLast{
println 'doLast'
}
}
task 可以理解为创建任务的关键字,实际上 task 是 Project 里面的一个方法,在 Groovy 中可以省略方法参数上的括号,花括号里的内容是一个闭包,主要是对 task 进行相关配置,doFirst 和 doLast 是 Task 中常用的两个方法,分别会在该 task 开始和结束时执行。
任务依赖
任务之间可以相互依赖,可以控制某个任务执行的先后顺序,比如在运行 A 之前必须先运行 B,此时任务 A 依赖任务 B,具体参考如下代码:
//单任务依赖:通过dependsOn指定要依赖的任务
task B(dependsOn: A){
doFirst{
println 'B'
}
}
task C{
doFirst{
println 'C'
}
}
//多任务依赖
task D{
dependsOn A, C
doFirst{
println 'D'
}
}
下面看一下执行多依赖任务 gradle D 的执行结果:
PS E:\Gradle\study\GradleSetting> gradle D
> Task :A
A
> Task :C
C
> Task :D
D
BUILD SUCCESSFUL in 2s
显然,执行任务 D,其依赖的其他两个任务先执行,控制了任务执行的先后顺序。
注意:脚本是按照顺序执行,如果任务任务 A 和 C 在任务 D 的后面定义,当执行任务 D 的时候肯定会出错。
任务间的交互
创建的任务都有自己的名称,其类型是 Task,那么我们就可以通过 Task API 来控制控制任务的执行,使用任务名操作任务的原理是:Project 在创建任务的时候,已经将该任务对应的任务声明为 Project 对象的一个类型为 Task 的一个属性,测试代码如下:
//任务之间的交互
task E{
println 'hello e'
println "E是不是Project的属性:"+project.hasProperty('E')
}
E.doFirst{
println 'doFirst'
}
E.doLast{
println 'doLast'
}
上述代码的执行结果如下:
PS E:\Gradle\study\GradleSetting> gradle E
> Configure project :
hello e
E是不是Project的属性:true
> Task :E
doFirst
doLast
BUILD SUCCESSFUL in 1s
自定义属性
Project 和 Task 都允许用户添加额外的自定义属性,通过应用所属对应的 ext 属性来实现,添加之后可以通过 ext 属性对自定义的属性进行读取和设置,如果要同时添加多个自定义属性,可以通过 ext 代码块,参考如下代码定义自定义属性:
apply plugin:"java"
//自定义单个属性
ext.name1 = "Gradle"
//自定义多个属性
ext{
age = 10
score = 100
}
//在SourceSet中使用自定义属性
sourceSets.all{
ext.resourceDir = null
}
//配置自定义属性
sourceSets{
main{
resourceDir = "main/res"
}
test{
resourceDir = "test/res"
}
}
task customProperty{
println "name=${name1}"
println "age=${age}"
println "score=${score}"
sourceSets.each {
println "${it.name} resourceDir is ${it.resourceDir}"
}
}
上述代码的执行结果:
PS E:\Gradle\study\GradleSetting> gradle customProperty
> Configure project :
name=Gradle
age=10
score=100
main resourceDir is main/res
test resourceDir is test/res
BUILD SUCCESSFUL in 2s
自定义属性相较局部变量作用域更加广泛,可以跨 Task、Project 访问自定义属性,只要能访问这些属性所属的对象,那么这些属性就可以被访问到, Android 开发中可以使用自定义属性单独定义版本号、版本名称以及用到的第三方库的版本,将其同意在单独的 gradle 文件中,各 Module 直接获取即可,不仅方便管理依赖库的版本,还在一定程度上提高工作效率。
总结
Gradle 脚本基于 Grooy ,而 Groovy 完全兼容 Java 语法,Gradle 脚本本质上还是代码,在 Gradle 中可以利用相关语法来完成相关功能。可以关注公众号:躬行之(jzman-blog),一起交流学习。
Gradle系列之构建脚本基础的更多相关文章
- 【Gradle】Gradle构建脚本基础
Gradle构建脚本基础 Settings文件 在Gradle中,定义了一个设置文件,用于初始化以及工程树的配置.设置文件的默认名为settings.gradle,放在根工程目录下. 设置文件大多数的 ...
- Gradle构建脚本基础
Gradle构建脚本,内部是基于 Groovy 的 DSL(领域特点语言),而Maven是基于XML的,Groovy相比XML更加简洁.灵活和强大. Groovy 因为给 Java 开发人员提供了最大 ...
- 【转载】Gradle学习 第六章:构建脚本基础
转载地址:http://ask.android-studio.org/?/article/11 6.1. Projects and tasks 项目和任务Everything in Gradle si ...
- 《Gradle权威指南》--Gradle构建脚本基础
No1: 设置文件默认名是setting.gradle,放在根目录下,大多数作用都是为了配置子工程 No2: 一个Project包含很多个Task.Task就是一个操作,一个原子性的操作.其实它是Pr ...
- shell 构建脚本基础
bash -v test.sh 启用 verbose 调试模式 bash -n test.sh 启用语法检查调试模式 bash -x test.sh 遍历脚本执行过程 一.基础参数 1.shell ...
- Gradle系列之Android Gradle基础配置
原文发于微信公众号 jzman-blog,欢迎关注交流. 通过前面几篇文章学习了 Gradle 基础知识以及 Gradle 插件相关的知识,关于 Gradle 及其插件相关知识请先阅读下面几篇文章: ...
- Gradle系列之认识Gradle任务
原文发于微信公众号 jzman-blog,欢迎关注交流. 前面几篇学习了 Gradle 构建任务的基础知识,了解了 Project 和 Task 这两个概念,建议先阅读前面几篇文章: Gradle系列 ...
- Gradle系列之Android Gradle插件
原文发于微信公众号 jzman-blog,欢迎关注交流. 通过前面几篇文章学习了 Gradle 基础知识以及 Gradle 插件相关的知识,关于 Gradle 及其插件相关知识请先阅读下面几篇文章: ...
- Gradle系列之Android Gradle高级配置
本篇文章主要在之前学习的基础上,从实际开发的角度学习如何对 Android Gradle 来进行自定义以满足不同的开发需求,下面是 Gradle 系列的几篇文章: Gradle系列之初识Gradle ...
随机推荐
- linu使用x之sz下载和rz上传
对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,但是很多Linux系统初始并没有这两个命令.今天,我们 ...
- Android选项卡学习
什么是选项卡 顶部的导航条就是选项卡了. Android开发中添加选项卡的步骤 图片不太懂上代码: activity_main.xml <?xml version="1.0" ...
- 恕我直言你可能真的不会java第2篇:Java Stream API?
一.什么是Java Stream API? Java Stream函数式编程接口最初是在Java 8中引入的,并且与lambda一起成为Java开发的里程碑式的功能特性,它极大的方便了开放人员处理集合 ...
- 恕我直言你可能真的不会java第3篇:Stream的Filter与谓词逻辑
一.基础代码准备 建立一个实体类,该实体类有五个属性.下面的代码使用了lombok的注解Data.AllArgsConstructor,这样我们就不用写get.set方法和全参构造函数了.lombok ...
- LevelDB/Rocksdb 特性分析
LevelDb是Google开源的嵌入式持久化KV 单机存储引擎.采用LSM(Log Structured Merge)tree的形式组织持久化存储的文件sstable.LSM会造成写放大.读放大的问 ...
- WeChair项目Beta冲刺(10/10)
团队项目进行情况 1.昨日进展 Beta冲刺第十天 昨日进展: 项目完工 2.今日安排 对小程序进行测试,同时对项目进行总结,并整理博客材料等 3.燃尽图 4.展示Git当日代码记录 详情 ...
- WeChair项目Alpha冲刺(1/10)
团队项目进行情况 1.昨日进展 因为是Alpha冲刺第一天,所以昨日进展无 2.今日安排 前端:完成前端页面的首页html+css部分 后端:搭建好SpringBoot项目以及完成实体类代码的编 ...
- AOP的概念
1.1 什么是AOP? 软件开发一直在寻求更加高效.更易维护甚至更易扩展的方式.软件开发的目的,最终是为了解决各种需求,包括业务需求和系统需求.使用面向对象方法,我们可以对业务需求等普通关注点进行很好 ...
- 33_栈程序演示.swf
pBottom执行栈底有效元素的前一个节点,该节点没有存储有效数据,这样设计是便于栈的管理,向链表一样pHead指向链表的第一个节点,该节点是不存储有效数据的 pTop执行栈顶最新的节点 如果pTop ...
- python实用笔记——IO编程
打开文件 f = open('/Users/michael/test.txt', 'r') 再读取 >>> f.read() 'Hello, world!' 最后关闭 >> ...