Gradle 学习之基础项目脚本

一、settings.gradle 文件

  1. 作用: 作为项目的设置文件,用于项目初始化以及多工程(子工程)的配置
  2. 默认名称: settings.gradle
  3. 存放位置: 项目根目录
  4. 注意点: 一个子工程只有在 settings.gradle 里面配置了,Gradle 才会识别,才会在构建的时候将其包括进去
  5. 多工程 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 文件

  1. 作用: 每一个工程都有一个 build.gradle 文件,是对应工程构建的入口,可以在这个入口针对工程做一些配置
  2. 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 项目
了解完 Gradle 构建项目的组成,下面我们就来谈谈搭建起整个构建项目的方砖: Task

  1. 创建任务
  • 创建一个任务很简单,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"
}
  1. Action 的概念: 每一个 Task 都是由一系列的 Action 对象组成,当一个 Task 被执行的时候,每一个 Action 都会依次执行。
    在 Task 中有两个重要方法:doFirstdoLast。这两个方法代表的 Action 可以在任务执行前和后分别执行:
task customTask5{
	doLast{
		println "after customTask5"
	}
	doFirst{
		println "before customTask5"
	}
	println "now customTask5"
}

doFirst 和 doLast

  1. 任务依赖: 使用 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"
	}
}

任务依赖

  1. 任务交互
    创建一个任务和定义一个变量是一样的,变量名称就是任务名称,变量类型自然就是 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"
}

任务交互

  1. 自定义属性
    添加自定义属性,相当于添加全局变量,这个全局不仅仅是单个 .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 权威指南》和互联网资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值