Gradle 产生背景
随着敏捷开发实践的崛起,人们从 XML 文件的构建方式,寻求一个可表达且可维护新的构建工具。Gradle就是满足这种需求的新的构建工具。
Gradle 优势
- Gradle 是基于 JVM 构建工具的新一代版本,它融合了 Ant 跟 Maven 中的优点,并且将其优点发挥更加极致。
- Gradle 使用了基于 Groovy 的 DSL,摈弃 XML,更加强大跟表达性强。开发者可以使用 Java,Groovy,Kotlin 等语言去编写构建逻辑。
- Gradle提供了一套依赖管理方式,不仅高度可配置,而且能够 Maven,Ivy 相兼容。Gradle 的依赖管理不仅限于外部库,同时还支持多项目构建,项目之间依赖建模。
- Gradle 还支持对 Ant 跟 Maven 的构建项目进行无缝迁移。
Gradle 特性
- 可表达的构建语言和底层API
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
我们上面看到这些Gradle脚本配置,其实是映射到Gradle API 中的 Project
,ScriptHandler
等实例中,并且调用该实例的对应方法。buildscript {}
便是对应Project
中的buildscript(Closure configureClosure)
函数。
-
gradle 就是 groovy
Gradle 的 DSL 语言就是用 Groovy 实现的,具有很强的可读性跟表达性。开发者可以用熟悉的编程语言表达需要的构建。 -
灵活的约定
Gradle 最主要的思想就是给予引导和有意义的默认值。也就是默认约定项目构建中源代码,单元测试,资源文件等存放目录以及功能等,而且编译代码,运行单元测试,发布代码等操作默认都集成到了构建生命周期中,只需要简单配置便可以实现。开发者并不需要知道这里面是如何实现的,只需要知道如何配置即可。Gradle 不仅默认配置好,而且还允许你打破这种约定,根据自己需求改变
相应的默认构建配置以及项目结构。 -
强大的依赖管理
Gradle 提供了一个基础设施去管理解析,获取和存储依赖的复杂性。Maven这样的依赖管理器他们的缓存管理是有缺陷的,当依赖版本发生变化的时候,常常会因为无法识别最新版本导致难于调试或者构建失败。Gradle 为此提供了可配置,可靠有效的依赖管理方案。同时,Gradle 还支持子模块依赖,会自动识别出哪个子模块的依赖需要重新构建,而不需要将子模块的文件缓存到本地缓存中。 -
可扩展的构建
Gradle 支持通过指定的任务输出和输入进行增量性构建。同时 Gradle 还可以以守护模式运行,提高启动效率,缩短编译时间。 -
轻松的可拓展性
如果要在项目构建中拓展相应的业务功能,可以在 Gradle 脚本中实现一个任务(task)来完成。同时还可以通过最强的拓展机制-插件来完成,不仅可以重用而且可以完全 Gradle API,就想写代码一样完成构建业务逻辑。
二.Gradle 入门
1. Gradle 安装部署
以 Windows 电脑为例,Gradle 要在机器上跑起来,需要先在电脑上安装 Java JDK 7 或者更高版本。所以先检查一下你电脑否是配置了 Java 环境,在终端输入以下命令行:
java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
如果出现以上命令行说明已经本地已经有 Java 环境了。
接下来就需要下载 Gradle。通过下载 链接可以下载到Gradle,在页面选择的时候,binary-only 跟 complete 选项,complete 就是完整版,里面包含文档跟源码,而 binary-only 只有 gradle 运行的基本东西。当然你也可以在线看文档 跟 源码 。
下载完成之后,通过解压,并且把bin目录下的路径配置到环境变量 path 中。配置完成之后,通过终端命令行进行校验:
gradle -v
------------------------------------------------------------
Gradle 4.4
------------------------------------------------------------
如果出现以上的文字,就说明已经整个 Gradle 配置完成了。
2. Gradle 简单使用
Gradle 构建脚本的默认名称是 build.gradle,当终端执行 gradle 命令行的时候,Gradle 就会默认寻找 build.gradle 的文件。接下来我们就实现一个简单的 HelloWord 的例子。
首先创建一个 build.gradle 文件,输出以下内容
task helloWord {
doLast {
println " Gradle HelloWord"
}
}
在文件目录下,终端执行命令行:
gradle helloWord
得到结果:
> Task :helloWord
Gradle HelloWord
到这里我们就简单完成一个小示例了。如果觉得一脸懵逼的话,先不着急,我先大致简单讲解一下。
很多开发者会把这个这个 task 理解成一个类型,把 helloWord 理解成这个变量的名字。如果这样理解的话,helloWord 大括号里面的内容就完成不符合我们平时学的编程语言的语法了。其实正确应该这么立即理解:
我给你换个写法,你估计就一下子焕然大悟了
task (helloWord, {
doLast {
println " Gradle HelloWord 1111"
}
})
没错,task() 其实就是一个函数 。这里面需要一个 String 的参数跟一个闭包,函数作用就是执行闭包的代码。不熟悉闭包的也不要紧,这里简单理解成一个函数就可以了,跟 Java 的匿名内部类有些相似。这样我们就很好理解了,其实我们创建 task,就是调用一个函数这么简单。现在想想,以前不懂这些机制,也能对一些配置进行修改跟添加,这就是 DSL 语言最大的好处了吧。
3. Gradle 命令行
虽然通过 IDE 的可视化操作可以很简单操作 gradle 命令行,但是如果能对 gradle 命令行进行深入理解,对以后理解构建也会有很大的帮助。
3.1 列出项目中的可用
gradle tasks
> Task :tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'code'.
components - Displays the components produced by root project 'code'. [incubating]
dependencies - Displays all dependencies declared in root project 'code'.
dependencyInsight - Displays the insight into a specific dependency in root project 'code'.
dependentComponents - Displays the dependent components of components in root project 'code'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'code'. [incubating]
projects - Displays the sub-projects of root project 'code'.
properties - Displays the properties of root project 'code'.
tasks - Displays the tasks runnable from root project 'code'.
To see all tasks and more detail, run gradle tasks --all
To see more detail about a task, run gradle help --task <task>
通过以上可以看到罗列很多 task,类似 buildEnvironment,components等这些就是可用的 task。当然你通过执行 helloWord 一样去校验一下。这里需要注意一下:
Build Setup tasks
Help tasks
我们可以看到这列,其实这是分组的意思,就是 Build Setup 组以下有init,wrapper 等 task。
3.2 查看使用帮助
gradle --help
通过这个命令行,可以查询到相关的命令行操作说明。
3.3 task 名字缩写
Gradle 有一个很有用的特性就是能以驼峰缩写的形式执行 task。以我们刚才的 helloWord task 为例,我们可以执行 gradle hW
也是达到同样的效果。但是这要目的一点,缩写的形式形式必须是唯一的,否则无法执行。比如你再创建一个 helloWordddd 的 task,这样是无法执行 gradle hW
缩写的。
3.4 守护进程
Gradle 有一个很强的特性就是守护进程。Gradle 3.0 以后守护进程默认启用。守护进程就是复利用上一次构建的计算来提高本次的构建速度 ,以避免启动时的开销,加快编译速度。通过 helloWord 为例:
gradle helloWord --daemon
这样就开启守护运行 task。如果要关闭的话,则执行
gradle helloWord --no–daemon