一、settings.gradle 文件
- 作用: 作为项目的设置文件,用于项目初始化以及多工程(子工程)的配置
- 默认名称:
settings.gradle - 存放位置: 项目根目录
- 注意点: 一个子工程只有在 settings.gradle 里面配置了,Gradle 才会识别,才会在构建的时候将其包括进去
- 多工程 settings.gradle 配置示例:
- 工程结构
- 文件存放位置
- settings.gradle 代码
rootProject.name = 'Multi'
include ':Hello','SP','SubHello'
project(':SP').projectDir = new File(rootDir,'SubProject')
project(':SubHello').projectDir = new File(rootDir,'Sub/hello')
二、build.gradle 文件
- 作用: 每一个工程都有一个 build.gradle 文件,是对应工程构建的入口,可以在这个入口针对工程做一些配置
- Root Project 也就是主工程的 build.gradle 文件可以获取到所有的子工程,所以可以对所有的子工程做统一配置,当然也可以对所有的工程进行统一配置
task outside{
println "Hello World Outside"
}
subprojects {
logger.info("subprojects$it")
repositories {
mavenCentral()
}
}
allprojects {
logger.info("allprojects$it")
repositories {
mavenCentral()
}
}
gradle -i outside 增加 -i 参数是为了打印出日志
三、项目与任务
一个完整项目的 Gradle 构建包含了很多的 Project,而一个 Project 又包含了很多个 Task,如果说一个完整的项目是一个完整的主工程,那么每一个 Project 就是一个子工程,或者说是模块,那么每一个 Task 就是子工程里面的一个完整性操作,以图来说明: 了解完 Gradle 构建项目的组成,下面我们就来谈谈搭建起整个构建项目的方砖: Task
- 创建任务
- 创建一个任务很简单,task 后面跟一个任务名称,再跟一个代码块,里面写上这个任务要做的事情:
task customTask1{
println "now customTask1"
}
- 在之前的博客里面有提到过 Groovy 函数调用的省略,这里就是省略后的简单写法。task 的本质其实是 Project 对象的一个函数,我们这里看一下他的原型以及如何转换成现在的样子:
Task task(String name, Closure configureClosure);
task("customTask2",{
println "now customTask2"
})
task("customTask2"){
println "now customTask2"
}
task "customTask2",{
println "now customTask2"
}
task customTask2{
println "now customTask2"
}
tasks.create "customTask3",{
println "now customTask3"
}
- Action 的概念: 每一个 Task 都是由一系列的 Action 对象组成,当一个 Task 被执行的时候,每一个 Action 都会依次执行。
在 Task 中有两个重要方法:doFirst 和 doLast 。这两个方法代表的 Action 可以在任务执行前和后分别执行:
task customTask5{
doLast{
println "after customTask5"
}
doFirst{
println "before customTask5"
}
println "now customTask5"
}
- 任务依赖: 使用 Task 对象的一个方法
dependsOn 任务与任务之间可以存在依赖关系,通过设定这种依赖关系,我们可以控制任务的执行顺序,以及执行的必要条件
task customTask4(){
doLast{
println "after customTask4"
}
}
task customTask2 {
doLast{
println "after customTask2"
}
}
task customTask1(dependsOn: customTask2) {
doLast{
println "after customTask1"
}
}
task customTask3(){
dependsOn customTask1,customTask4
doLast{
println "after customTask3"
}
}
- 任务交互
创建一个任务和定义一个变量是一样的,变量名称就是任务名称,变量类型自然就是 Task 类。所有我们可以通过任务名,使用 Task 的 API 访问它的方法,属性以及修改 Task 配置等。
- 需要注意的是脚本是顺序执行的,所以我们必须先声明定义后使用
- 通过任务名称操作任务的原理是:Project 在创建任务的时候,同时把任务名称注册为 Project 的一个属性
task customTask1{
println "last1 customTask1"
def hasCustomTask1Property = project.hasProperty("customTask1")
println "hasCustomTask1Property $hasCustomTask1Property"
}
customTask1.doFirst {
println "first customTask1"
}
customTask1.doLast {
println "last2 customTask1"
}
- 自定义属性
添加自定义属性,相当于添加全局变量,这个全局不仅仅是单个 .gradle 文件,而是可以跨越 Project,跨越 Task 的。 通过 ext 属性可以实现添加自定义属性:
ext.mark = "define Outside"
ext {
rootName = "Multi"
address = "Outside"
}
task inside{
println "Hello World Inside"
println "mark==$mark"
println "rootName==$rootName address==$address"
}
四、书写 Gradle 脚本代码的本质
这本书的第三章最后一小节,我觉得写得非常好,让我看待 Gradle 的方式发生了一定的改变,这里和大家分享一下作者的核心观点:
虽然我们在一个 Gradle 文件中写脚本,但是我们写的都是代码,这一点一定要记清楚,这样你才能时刻使用 Groovy、Java 以及 Gradle 的任何语法和 API 帮你完成你想做的事情。 不要被脚本这两个字限制住,是脚本吗?是的没错,但是不是简单的脚本。在这简单的脚本文件上你可以定义 Class、内部类、导入包、…、枚举等,都是可以的,灵活运用。
整理学习自飞雪无情大佬的《Android Gradle 权威指南》和互联网资料
|