Gradle 学习之基础项目脚本
Posted Nicholas_hzf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gradle 学习之基础项目脚本相关的知识,希望对你有一定的参考价值。
一、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 对象的一个函数,我们这里看一下他的原型以及如何转换成现在的样子:
// Project.java
Task task(String name, Closure configureClosure);
task("customTask2",
println "now customTask2"
)
// Groovy 规定如果方法的最后一个参数是闭包,可以放到方法后面
task("customTask2")
println "now customTask2"
// Groovy 规定调用方法的时候,如果参数不为空,则可以省略括号
task "customTask2",
println "now customTask2"
// 通过 Groovy AST 转换,目前暂时不需要了解什么是 AST
task customTask2
println "now customTask2"
- 通过 TaskContainer 来创建任务
// tasks 为 Project 对象中的一个属性
// create 是 TaskContainer 对象的一个方法
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"
// 通过 Project 对象的 hasProperty 方法可以得出
// 任务名 customTask1 确实为 Project 对象的一个属性
def hasCustomTask1Property = project.hasProperty("customTask1")
println "hasCustomTask1Property $hasCustomTask1Property"
customTask1.doFirst
println "first customTask1"
customTask1.doLast
println "last2 customTask1"
- 自定义属性
添加自定义属性,相当于添加全局变量,这个全局不仅仅是单个 .gradle 文件,而是可以跨越 Project,跨越 Task 的。 通过ext
属性可以实现添加自定义属性:
// 在上面的多工程构件示例中主工程下的 build.gradle 中添加自定义属性
// 自定义一个属性
ext.mark = "define Outside"
// 自定义多个属性
ext
rootName = "Multi"
address = "Outside"
// 在子工程 SubHello 里面的 build.gradle 调用
task inside
println "Hello World Inside"
println "mark==$mark"
println "rootName==$rootName address==$address"
四、书写 Gradle 脚本代码的本质
这本书的第三章最后一小节,我觉得写得非常好,让我看待 Gradle 的方式发生了一定的改变,这里和大家分享一下作者的核心观点:
虽然我们在一个 Gradle 文件中写脚本,但是我们写的都是代码,这一点一定要记清楚,这样你才能时刻使用 Groovy、Java 以及 Gradle 的任何语法和 API 帮你完成你想做的事情。
不要被脚本这两个字限制住,是脚本吗?是的没错,但是不是简单的脚本。在这简单的脚本文件上你可以定义 Class、内部类、导入包、…、枚举等,都是可以的,灵活运用。
整理学习自飞雪无情大佬的《android Gradle 权威指南》和互联网资料
以上是关于Gradle 学习之基础项目脚本的主要内容,如果未能解决你的问题,请参考以下文章