subprojects {
apply plugin:'java'
repositories{
jcenter()
}
}
我们可以在rootProject中对子Project进行统一的配置,但是不要误以为subProjects只能配置,它们只是两个方法,接受一个闭包作为参数,对工程进行遍历。遍历的过程中调用我们自定义的闭包,所以我们可以在闭包里面配置、打印、输出或者修改Project的属性都可以。
1、Task创建
task customTask {
doFirst {
println "doFirst"
}
doLast {
println "doLast"
}
}
这里的task看着像是一个关键字,其实它是Project对象的一个函数。其中task为函数名,customTask为第一个参数,闭包为第二个参数。
Task task(String name, Closure configureClosure);
另外一种创建任务的方式:
tasks.create(taskName){......}
2、Task依赖
创建任务的时候,可以通过dependsOn指定依赖的其他任务。
Task Api:
@Internal
Set<Object> getDependsOn();
因此,我们在创建task的时候,在其闭包中对Task进行配置 - 闭包委托;
task customTask {
dependsOn customTask1, customTask2
doLast {
println "multiTask"
}
}
被依赖的任务会先执行,然后再执行当前任务。
3、Task间通过Api控制、交互
创建一个任务和定义一个变量一样,变量名就是我们定义的任务名,类型是Task。所以可以通过任务名,使用Task的Api访问它的方法、属性或对任务进行重新配置等。
由于脚本是顺序执行的,因此使用任务名操作任务之前,必须先定义声明。
task exeHello {
println "hello"
}
exeHello.doFirst {
println "hello - doFirst"
}
exeHello.doLast {
println "hello - doLast"
}
直接通过任务名操纵任务的原理:
Project在创建该任务的时候,同时把该任务对应的任务名注册为Project的一个属性,类型名为Task。
exeHello.doLast {
println project.hasProperty('exeHello')
}
--------------
true
我们可以通过project.hasProperty方法检查是否有这个属性。
既然可以通过Api操纵任务,那么当创建多个任务的时候,同样可以通过APi让它们相互访问,比如增加一些依赖等,就像两个变量相互访问一样。
4、自定义属性
Project和Task都允许用户添加额外的自定义属性,要添加额外的属性,通过应用属性对应的ext属性即可实现。添加之后可以通过ext属性对自定义属性读取和设置。
单个:
ext.age = 18
多个:
ext {
name = "json"
age = 18
}
相比于局部变量,自定义属性有更为广泛的作用域,你可以跨Project、跨Task访问这些自定义属性,只要你能访问这些属性所属的对象,那么这些属性都可以被访问到。
自定义属性不仅可以应用于Project和Task上,还可以应用在SourceSet中,这样等于每种SourceSet又多了一个可供配置的属性。
5、脚本即代码,代码也是脚本
虽然我们在一个gradle文件中写脚本,但是我们写的是代码,这一点要记清楚。这样你才能时刻使用Groovy、Java以及Gradle的任何语法和Api帮你完成你想做的事情。不要被脚本两个字限制了,是脚本没错,但是不是简单的脚本。在这个脚本文件上你可以定义Class、内部类、导入包、定义方法、常量、接口、枚举等,都是可以的,灵活运用。
------> 脚本文件中搭配Java、Gradle、Groovy,不要把它当成简单的脚本。