本文意在快速了解Gradle构建脚本基础,后续会补充练习Demo方便读者本身动手验证文章中的内容以加深记忆.闭包
在Android项目的根目录中有一个settings.gradle
文件,由名字能够看出,它是一个设置文件,用于初始化及工程树的配置.
设置文件大多数的做用都是为了配置子工程.(Gradle根工程和子工程的概念与Android项目的Project和Module同样,根工程至关于Project,而子工程至关于Module)
,一个子工程只有在settings.gradle
文件中配置了才能被Gradle识别并在构建的时候包含进去.app
rootProject.name='GradleDemo' //根工程名
include ':app', ':common' //配置子工程
project(':common').projectDir = new File('librarys/common') //指定路径
复制代码
如上面这段代码中所展现同样,定义了一个子项目common
并指定了相应的目录.(若是不指定,默认目录是其同级目录,好比 incluede ':common',若是不指定,Gradle就会把当前同级的common目录做为common工程的目录,但若是此时同级下没有common目录,就会报错)
,利用这个特性,只要在settings.gradle
文件中指定好路径,咱们就能够将咱们的工程放到任意目录下,能够灵活的对工程进行分级、分类.函数
每个Project都有会有一个Build文件,是该Project构建的入口,在这里能够对Project进行配置,如版本、插件、依赖等.
既然每一个Project都有Build文件,那么也就会有RootProject和ChildProject的区别.
RootProject位于根工程下,ChildProject位于子工程下,且RootProject能够获取到全部的ChildProject,因此此时能够对全部的ChildProject进行统一配置,好比应用的插件、依赖的Maven中心库等.测试
//配置全部childProject
subprojects {
repositories {
jcenter()
}
}
//配置全部Project包含RootProject
allprojects {
repositories {
jcenter()
}
}
复制代码
Task翻译成中文就是任务,它是一个原子性的操做.好比编译一次代码,复制一份文件等都是一个Task.gradle
Project其实就是一个在咱们开发过程当中对业务场景进行拆分解耦而成的一个个独立的模块,最后由这一个个的Project组成了整个Gradle构建.每一个Project中都会包含多个Task,也能够说Project是由多个Task组成的.ui
方式一:
task customTask{
doFirst{
println 'customTask1:doFirst'
}
doLast{
println 'customTask1:doLast'
}
}
方式二:
tasks.create('customTask'){
doFirst {
println 'customTask1:doFirst'
}
doLast {
println 'customTask1:doLast'
}
}
执行「gradle -q customTask」打印结果为:
>>>
customTask1:doFirst
customTask1:doLast
复制代码
这里的task
看起来像是一个关键字,但其实他是Project对象的一个函数,原型是create(String name,Closure configureClosure)
,第一个参数name
是Task的名字也就是customTask
,第二个参数是一个闭包,也就是咱们花括号中的代码块,根据闭包的规则,最后一个参数是闭包时,能够放到括号外面,而后方法的括号能够省略,就变成咱们上面的写法了.该闭包的做用就是用来对咱们建立的任务进行配置.spa
Task之间是能够有依赖关系的,那么什么是依赖关系呢,其实就是ATask要等BTask执行后才能执行,经过Task间的依赖能够控制Task执行的前后顺序,好比在Android中,install Task
是依赖于package Task
进行打包生成apk后才能安装到设备里.
示例: 把大象装冰箱总共分几步插件
task buyAFridgeAndAnElephant{
println '买一台冰箱和一头大象'
}
task openTheRefrigeratorDoor(dependsOn: buyAFridgeAndAnElephant) {
println '把冰箱门打开'
}
task putTheElephantInTheFridge() {
println '把大象放进冰箱'
}
task closeTheRefrigeratorDoor {
dependsOn openTheRefrigeratorDoor, putTheElephantInTheFridge
println '把冰箱门关上'
}
执行「gradle -q closeTheRefrigeratorDoor」打印结果为:
>>>
买一台冰箱和一头大象
把冰箱门打开
把大象放进冰箱
把冰箱门关上
复制代码
由示例代码咱们能够看见,经过dependsOn
能够指定其依赖的Task,openTheRefrigeratorDoor
依赖于buyAFridgeAndAnElephant
,因此执行openTheRefrigeratorDoor
的时候buyAFridgeAndAnElephant
会被优先执行来做为启动openTheRefrigeratorDoor
的条件,保证了执行的顺序.同时,一个Task能够同时依赖多个Task,但Task之间不能相互依赖.翻译
建立一个任务和咱们定义一个变量是同样的,变量名就是咱们定义的任务名,类型是Task.因此咱们能够经过任务的名字,使用Task的API访问它的方法、属性或者对Task从新配置等.
若是要使用任务名对任务进行操做,必须先定义声明,由于脚本是顺序执行的.
示例:code
task eat{
println '吃饭'
}
eat.doLast{
println '刷碗'
}
执行「gradle -q eat」打印结果为:
>>>
吃饭
刷碗
复制代码
如上示例,调用了doLast
方法,在任务执行后作一些额外的操做.
对于直接经过任务名操做任务的原理是:**Project在建立该任务的时候,同时把该任务对应的任务名注册为Project的一个类型为Task的属性.咱们能够测试一下.
task eat{
println '吃饭'
}
eat.doLast{
println project.hasProperty('eat')
println '刷碗'
}
执行「gradle -q eat」打印结果为:
>>>
吃饭
true
刷碗
复制代码
打印结果中project.hasProperty('eat
)输出结果为true
,说明每个任务都是Project的属性.
Project和Task都容许用户添加额外的自定义属性,要添加额外的属性,经过应用所属对应的ext属性
便可实现.添加以后能够经过ext属性
对自定义属性读取和设置,若是要同时添加多个自定义属性,能够经过ext代码块
.
ext.email = 'hippox.rd@gmail.com'
ext{
name = '墨非白'
location = '北京'
}
task customProperty{
println email
println name
println location
}
打印结果为:
hippox.rd@gmail.com
customProperty
北京
复制代码
这些自定义属性能够跨Projet、Task访问,只要能访问到这些属性所属的对象,那么这些属性就均可以被访问. 自定义属性不单单局限于Project和Task,还能够应用在SourceSet中,这样等于每种SourceSet又多了一个可供配置的属性.
未完待续,下一篇文章会对Task进行详细介绍.