1.Build
每个Project都会有一个Build文件,该文件是Project构建的入口,可以在这里针对该Project进行配置,比如配置版本,需要哪些插件,依赖哪些库等。
比如我们在开发一个大型Java工程时,该工程被分为很多小模块,每个模块都是一个Child Project,这些模块同样也是Java工程,这种情况我们也可以统一配置,应用Java插件:
subprojects{
apply plugin: 'java'
repositories{
jcenter()
}
}
除了提供的subprojects之外,还有allprojects,从其名字就可以看出来,是对所有Project的配置。但是大家不要误以为subprojects和allprojects只能配置。它们是两个方法,接受一个闭包作为参数,对工程进行遍历,遍历的过程中调用我们自定义的闭包,所以我们可以在闭包里配置、打印、输出或修改Project的属性都可以。
2.任务依赖
任务之间是可以有依赖关系的,这样我们就能控制哪些任务先于哪些任务执行。比如我们运行jar任务之前,compile任务一定要执行过,也就是jar依赖于compile。
task ex<<{
println "ex"
}
task exMain(dependsOn:ex){
doLast{
println "main"
}
}
执行命令:gradle exMain
输出:
Task :ex
ex
Task :exMain
main
通过dependsOn可以指定依赖的任务,exMain任务依赖于ex,所以会先执行ex任务,然后再执行exMain任务。
同时依赖多个任务:
task ex<<{
println "ex"
}
task ex2<<{
println "ex2"
}
task exMain{
dependsOn ex,ex2
doLast{
println "main"
}
}
输出:
Task :ex
ex
Task :ex2
ex2
Task :exMain
main
3.任务间通过API控制、交互
创建一个任务和我们定义一个变量是一样的,变量名就是我们定义的任务名,类型是Task。所以我们可以通过任务名,使用Task的API访问它的方法、属性或者对任务重新配置等。
和变量一样,要使用任务名操纵任务,必须先定义声明,因为脚本是顺序执行的:
task ex3<<{
println "ex3"
}
ex3.doFirst{
println "doFirst"
}
ex3.doLast{
println "doLast"
}
输出:
Task :ex3
doFirst
ex3
doLast
如上示例,我们调用了doLast和doFirst方法,在任务执行前后做一些事情。对于直接通过任务名操纵任务的原理是:Project在创建的时候,同时把该任务对应的任务名注册为Project的一个属性,类型是Task。
3.自定义属性
Project和Task都允许用户添加额外的自定义属性,要添加额外的属性,通过应用所属对应的ext属性即可实现。添加之后可以通过ext属性对自定义属性读取和设置,如果要同时添加多个自定义属性,可以通过ext代码块:
task ex4<<{
//自定义一个Project的属性
ext.age=18
//通过代码块同时自定义多个属性
ext{
phone=1255
address='北京'
}
println "年龄:{phone}"
println "地址:${address}"
}
输出:
Task :ex4
年龄:18
电话:1255
地址:北京
相比于局部变量,自定义属性有更为广泛的作用域,你可以跨Project,跨Task访问这些自定义属性。
自定义属性不仅仅局限在Project和Task上,还可以应用在SourceSet中,这样等于每种SourceSet又多了一个可供配置的属性。
apply plugin:"java"
//自定义一个Project的属性
ext.age=18
//通过代码块同时自定义多个属性
ext{
phone=1255
address='北京'
}
sourceSets.all{
ext.resourcesDir=null
}
sourceSets{
main{
resourcesDir='main/res'
}
test{
resourcesDir='test/res'
}
}
task ex4<<{
println "年龄:{phone}"
println "地址:{it.name}的resourcesDir是:${it.resourcesDir}"
}
}
输出:
Task :ex4
年龄:18
电话:1255
地址:北京
main的resourcesDir是:main/res
test的resourcesDir是:test/res
从程序运行可见,我们自定义的属性都生效了。在项目中一般使用它来自定义版本号和版本名称,把版本号和版本名称单独放在一个gradle文件中。。
4.脚本即代码,代码也是脚本
虽然我们在一个Gradle文件中写脚本,但是我们写的都是代码,这一点一定要记住,这样才能时刻使用Groovy、Java以及Gradle的任何语法和API帮你完成你想要做的事情。不要被脚本这两个字给限制住。在这个脚本文件上你可以定义Class、内部类、导入包、定义方法、常量、接口、枚举等,都是可以的,灵活运用。我们在项目中需要给生成的apk包以当前日期的格式命名,我们就定义一个获取日期格式的方法,用于生成apk的文件名:
task ex5<<{
def date=new Date()
def formatDate=date.format('yyyyMMddMMSS')
println "当前时间${formatDate}"
}
输出:
Task :ex5
当前时间2018082308619
网友评论