Gradle系列之构建脚本基础

原文发于微信民众号 jzman-blog,迎接关注交流。

前面两篇文章划分先容了 Gradle 基础知识以及 Groovy 相关基础知识,这也是学习 Gradle 所必须领会的,文章链接如下::

本文将对 Gradle 整体举行了先容和学习,领会了 Task、Project 等相关观点以及对使用 Gradle 来构建项目的一些常用操作,主要内容如下:

  1. Setting 文件
  2. Build 文件
  3. Project 和 Tasks
  4. 义务的建立
  5. 义务依赖
  6. 义务间的交互
  7. 自界说属性
  8. 总结

Setting 文件

说一下 Gradle 构建项目的 Setting 文件,该文件主要用来设置当前工程,好比 Android 开发中一个项目中可能有多个子 Module,当不需要某个子 Module 时,可以作废该 Module 在设置文件 Setting 中的设置即可,固然只有在 Setting 文件中设置的子 Module 才会被构建,固然不只是 Android 开发,只要使用 Gradle 构建的项目都一样,Setting 是 Gradle 构建项目默认的设置文件名,下面简朴测试一下 Setting.gradle 文件的使用,测试工程目录如下:

├─GradleSetting
│  ├─.gradle
│  │  ├─4.1
│  │  │  ├─fileChanges
│  │  │  ├─fileHashes
│  │  │  └─taskHistory
│  │  └─buildOutputCleanup
│  └─test
│      └─Method
│          └─.gradle
│              ├─4.1
│              │  ├─fileChanges
│              │  ├─fileHashes
│              │  └─taskHistory
│              └─buildOutputCleanup
│ build.gradle
│ setting.gradle

在工程名为 GradleSetting 的工程中 test 文件夹下有一个 Method 的子项目,这里会通过设置 setting.gradle 文件将子项目 Method 构建到 GradleSetting 中,setting.gradle 文件内容如下:

println "---------test----Setting.gradle----------"
//输出当前工程目录
println(rootDir)
//指定要介入构建的子项目
include ':Method'
project(':Method').projectDir = new File(rootDir,'test/Method')

来看一下输出效果:

PS E:\Gradle\study\GradleSetting> gradle testGradleSetting
---------test----Setting.gradle----------
E:\Gradle\study\GradleSetting

> Configure project :
testGradleSetting

> Configure project :Method
3
3
30
获取方式返回的效果:30
1
2
3
4
5


BUILD SUCCESSFUL in 2s

由于在 setting.gradle 文件中设置了 Method,从输出效果看 Method 确实介入了构建,作废在 setting.gradle 文件中的设置,则不会构建 Method,最好自己验证一下。

上面设置了子项目 Method 所在的位置,若是不指定则默认是与 setting.gradle 同级的目录。

Build 文件

若是选择使用 Gradle 构建项目,则每个项目都有一个 build.gradle 文件,该文件是项目构建的入口,对整个项目的设置生效,可以在根项目设置子项目的一下通用设置,好比设置子项目的堆栈为 jcenter,这样子项目中所有的依赖就指向 jcenter 中央库下载,下面是参考代码:

//设置子项目依赖的堆栈
subprojects{
	repositories{
		jcenter()
	}
}

//设置所有项目
allprojects{
	
}

...

通过本小节主要领会 build.gradle 文件的作用即可,现实开发中针对差别类型的项目会有更详细的响应设置计谋。

Project 和 Tasks

在 Gradle 中有许多 Project,可将某个 Project 打包成 jar 提供给另一个 Project 使用,每个 Project 都是凭据其营业需求抽象出来的一个子模块,最终通过 Gradle 构建成完整的项目。

每个 Project 允许有多个 task,Task 理解为义务,task 主要 完成某个详细的功效点,好比 wrapper task 主要就是完成 wrapper 文件的建立。

Elasticsearch从入门到放弃:再聊搜索

义务的建立

对于义务的建立已经对照熟悉了,下面使用 task 声明一个义务:

//1. 建立一个义务
task createTask{
	doFirst{
		println 'doFirst'
	}

	doLast{
		println 'doLast'
	}
}

//2. 使用TaskContainer建立一个义务,Project已经界说的TaskContainer,即tasks
tasks.create("createTask1"){
	doFirst{
		println 'doFirst'
	}

	doLast{
		println 'doLast'
	}
}

task 可以理解为建立义务的关键字,现实上 task 是 Project 内里的一个方式,在 Groovy 中可以省略方式参数上的括号,花括号里的内容是一个闭包,主要是对 task 举行相关设置,doFirst 和 doLast 是 Task 中常用的两个方式,划分会在该 task 最先和结束时执行。

义务依赖

义务之间可以相互依赖,可以控制某个义务执行的先后顺序,好比在运行 A 之前必须先运行 B,此时义务 A 依赖义务 B,详细参考如下代码:

//单义务依赖:通过dependsOn指定要依赖的义务
task B(dependsOn: A){
	doFirst{
		println 'B'
	}
}

task C{
	doFirst{
		println 'C'
	}
}

//多义务依赖
task D{
	dependsOn A, C
	doFirst{
		println 'D'
	}
}

下面看一下执行多依赖义务 gradle D 的执行效果:

PS E:\Gradle\study\GradleSetting> gradle D

> Task :A
A

> Task :C
C

> Task :D
D

BUILD SUCCESSFUL in 2s

显然,执行义务 D,其依赖的其他两个义务先执行,控制了义务执行的先后顺序。

注重:剧本是根据顺序执行,若是义务义务 A 和 C 在义务 D 的后面界说,当执行义务 D 的时刻肯定会失足。

义务间的交互

建立的义务都有自己的名称,其类型是 Task,那么我们就可以通过 Task API 来控制控制义务的执行,使用义务名操作义务的原理是:Project 在建立义务的时刻,已经将该义务对应的义务声明为 Project 工具的一个类型为 Task 的一个属性,测试代码如下:

//义务之间的交互
task E{
	println 'hello e'
	println "E是不是Project的属性:"+project.hasProperty('E')
}

E.doFirst{
	println 'doFirst'
}

E.doLast{
	println 'doLast'
}

上述代码的执行效果如下:

PS E:\Gradle\study\GradleSetting> gradle E

> Configure project :
hello e
E是不是Project的属性:true

> Task :E
doFirst
doLast


BUILD SUCCESSFUL in 1s

自界说属性

Project 和 Task 都允许用户添加分外的自界说属性,通过应用所属对应的 ext 属性来实现,添加之后可以通过 ext 属性对自界说的属性举行读取和设置,若是要同时添加多个自界说属性,可以通过 ext 代码块,参考如下代码界说自界说属性:

apply plugin:"java"

//自界说单个属性
ext.name1 = "Gradle"
//自界说多个属性
ext{
	age = 10
	score = 100
}

//在SourceSet中使用自界说属性
sourceSets.all{
	ext.resourceDir = null
}

//设置自界说属性
sourceSets{
	main{
		resourceDir = "main/res"
	}
	test{
		resourceDir = "test/res"
	}
}

task customProperty{
	println "name=${name1}"
	println "age=${age}"
	println "score=${score}"

	sourceSets.each {
		println "${it.name} resourceDir is ${it.resourceDir}"
	}
}

上述代码的执行效果:

PS E:\Gradle\study\GradleSetting> gradle customProperty

> Configure project :

name=Gradle
age=10
score=100
main resourceDir is main/res
test resourceDir is test/res

BUILD SUCCESSFUL in 2s

自界说属性相较局部变量作用域加倍普遍,可以跨 Task、Project 接见自界说属性,只要能接见这些属性所属的工具,那么这些属性就可以被接见到, Android 开发中可以使用自界说属性单独界说版本号、版本名称以及用到的第三方库的版本,将其同意在单独的 gradle 文件中,各 Module 直接获取即可,不仅利便治理依赖库的版本,还在一定程度上提高工作效率。

总结

Gradle 剧本基于 Grooy ,而 Groovy 完全兼容 Java 语法,Gradle 剧本本质上照样代码,在 Gradle 中可以行使相关语法来完成相关功效。可以关注民众号:躬行之(jzman-blog),一起交流学习。
Gradle系列之构建脚本基础

原创文章,作者:2d28新闻网,如若转载,请注明出处:https://www.2d28.com/archives/22893.html