构建块
每个Gradle构建都包含三个基本的构建快,project,task和property,每一个构建块至少包含一个project,进而又包含一个或多个task,project和task的暴露的属性可以控制构建
在Gradle中可以有很多的Project,其实每一个Project都是在你的业务范围内,被你抽象出来的一个独立的模块,你可以根据项目的情况进行抽象分类,最后一个个的Project组成了整个Gradle的构建
每个Project由多个Task组成,Task就是一个原子性的操作
Project
一个项目(project)代表一个正在构建的组件(如:一个jar文件),或者一个想要完成的目标,每个Gradle脚本至少定义一个项目,当构建进程启动后,Gradle基于build.gradle中的配置实例化org.gradle.api.Project类,并通过project变量使其隐式可用
Task
Gradle 的构建生命周期
在初始化阶段,Gradle为项目创建了一个Project实例,在给定的构建脚本中定义了一个项目,构建阶段,非常适合加载所需配置,执行阶段,就是最终的动作
Setting文件
在Gradle中定义了一个设置文件,用于初始化工程树配置,该文件默认名为Setting.gradle,放在工程的根目录下
该文件作用为配置子工程,一个根工程包括很多子工程,对应在Android Studio 中的 Project =rootProject和Module=子Project
一个子工程只有在Setting.gradle中配置了才会别Gradle识别,才会在构建的时候包含进去
Build文件
每一个Project都会有一个Build.gardle文件,该文件是Project构建的入口,可以在这里针对每一个Project进行配置,比如配置版本,插件,依赖等
RootProject 可以获取到所有的ChildProject,所以我们可以在RootProject中对ChildProject进行统一配置
例如
allprojects {
repositories {
google()
jcenter()
}
}
Gradle 任务
创建任务
除了实现Hello World的例子采用的创建任务方式,还有其他的3种创建任务方式。
1.直接用任务名称创建。
def Task hello=task(hello)
hello.doLast{
println "hello world"
}
2.任务名称+任务配置的Map对象创建。
def Task hello=task(hello,group:BasePlugin.BUILD_GROUP)
hello.doLast{
println "hello world"
}
3.TaskContainer的create方法创建。
tasks.create(name: 'hello') << {
println "hello world"
}
任务依赖
任务依赖会决定任务运行的先后顺序,被依赖的任务会在定义依赖的任务之前执行。创建任务间的依赖关系如下所示。
task hello << {
println 'Hello world!'
}
task go(dependsOn: hello) << {
println "go for it"
}
在hello任务的基础上增加了一个名为go的任务,通过dependsOn来指定依赖的任务为hello,因此go任务运行在hello之后。
运行gradle -q go构建脚本,打印结果如下:
Hello world!
go for it
任务的分组和描述
Gradle有任务组的概念,可以为任务配置分组和描述,以便于更好的管理任务,拥有良好的可读性。改造3.2小节的例子,为hello任务添加分组和描述。
task hello {
group = 'build'
description = 'hello world'
doLast {
println "任务分组: ${group}"
println "任务描述: ${description}"
}
}
task go(dependsOn: hello) << {
println "go for it"
}
也可以采用其他的创建任务方式来为任务添加分组和描述,如下所示。
def Task hello=task(hello)
hello.description ='hello world'
hello.group=BasePlugin.BUILD_GROUP
hello.doLast{
println "任务分组: ${group}"
println "任务描述: ${description}"
}
task go(dependsOn: hello) << {
println "go for it"
}
排除任务
如果我们不想运行go任务,可以运行gradle hello -x go命令:
获取所有任务
通过运行gradle tasks命令来获取所有的任务信息,这样就不需要打开源码了
获取任务帮助信息
通过运行gradle help --task hello命令来显示hello任务的帮助信息。
可以看到hello任务的路径、类型、描述和分组。
多任务调用
通过命令行一次执行多个任务,每个任务通常只会执行一次,我们运行gradle task1 task2,会先执行task1任务后执行task2任务
任务名称缩写
可以对使用驼峰命名的任务进行缩写,对于名称特别长的任务这个特性非常有用,不过需要注意一点,那就是任务名称的缩写必须是唯一的
自定义属性
project个task 都允许用户添加自定义属性,要添加额外的属性,用ext属性就可以实现,添加后可以通过ext 对自定义属性,读取和设置。
//定义一个project 属性
project.ext.age =18
//定义多个自定义属性
ext{
name1 = "renxiaohui"
sex="男"
}
task bb {
doLast{
println(age+name1+sex)
}
}
执行 bb任务输出:
任务排序
TaskB.shouldRunAfter (TaskA) 表示 TaskB应该在TaskA执行后在执行
TaskB.mustRunAfter (TaskA) 表示 TaskB必须在TaskA执行后在执行,更加严格
任务的启用和禁止
Task中有一个属性enabled,用于启用和禁止任务,默认是true启用,设置false 表示禁用
任务的onlyif 断言
断言就是一个条件表达式,Task有一个onlyif方法,他接受一个闭包作为参数,如果该闭包返回true,则任务执行,如果该闭包返回false,任务不执行
//定义一个project 属性
project.ext.age =18
//定义多个自定义属性
ext{
name1 = "renxiaohui"
sex="男"
}
task bb {
doLast{
println(age+name1+sex)
}
}
bb.onlyIf{
true
}