Gradle 学习之基础项目脚本

Posted Nicholas_hzf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 构建项目的组成,下面我们就来谈谈搭建起整个构建项目的方砖: 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"

  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 权威指南》和互联网资料

以上是关于Gradle 学习之基础项目脚本的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 学习之基础项目脚本

Gradle 学习之 Groovy 基础

Gradle 学习之 Groovy 基础

Gradle 学习之 Groovy 基础

Android学习之基础知识二(build.gradle文件详解)

Gradle学习之构建java与web项目