现在都9102年了,还写Gradle的笔记还真有点不好意思啊!
本人最近在整理笔记,把之前学习的Gradle资料整理分享一下,希望能帮到有需要的朋友。

Gradle系列笔记
- Gradle-1-什么是Gradle
- Gradle-2-Script、Project、Task
- Gradle-3-构建阶段
- Gradle-4-Task再学习
- Gradle-5-hook
- 未完待续
什么Gradle
Gradle是一个流行的项目构建工具,它使用基于JVM运行的groovy语言定义了一套专门用于项目构建的DSL①。以下是其特性和作用的简单介绍
- 可以用来构建Android项目,也可以用于构建Java Web项目等
- Gradle脚本是使用groovy动态语言编写的,而groovy完全继承了Java语言,并且比Java语言更加灵活
①DSL:特定领域语言,其特性语法是为了专门解决某一领域而定义的语言。其通用性不强,或者说没有。例如Java,可以开发Java web、Android、PC程序等。而Gradle定义的DSL只针对于项目构建领域,暂无其他通用性。Groovy并不是DSL,只是被Gradle作为其DSL的专用语言而已。
Gradle入门
在了解Gradle是如何构建项目之前,先看看Gradle是如何进行工作的
安装
本文采用Windows作为实操环境,首先在下载Gradle工具包。截止本文章编写日期,最新的Gradle版本是5.4.x
,在这里使用4.10.3
,下载传送门。
在Windows的环境变量path值上添加gradle的执行目录,例如本机的E:\Gradle\gradle-4.10.3\bin
。之后在cmd上运行gradle -v
,如果成功打印gradle版本号既是安装成功。记住必须先安装JDK,最好是1.8版本。
搞定之后,建立一个英文目录,在该目录下添加一个build.gradle
文件,编辑代码
task hello{
doLast{
println 'Hello World!'
}
}
在命令行中进入到该目录,运行gradle -q hello
,可以看到命令行窗口打印出
D:\GradleLab\book_code>gradle -q hello
Hello World!
另外,在该目录下还生成了一个.gradle
文件夹,该文件夹是项目的编译缓存。
接着对以上代码进行解析,task
代表定义一个任务,任务名称为hello。任务中doLast{}
是一个Action,按照Java中的理解Action代表一个回到。它运行在Task运行开始或者结束之时。
而运行脚本代码的指令gradle -q hello
,gradle
是使用gradle sdk,-q
是打印日志,-q
中的q
代表日志级别,hello
在build.gradle
中定义的任务名称。
而gradle.build
文件是Gradle默认的构建脚本文件,如果在将名称修改就无法识别了。例如将其改为build1.gradle
再运行gradle -q hello
,会提示Task 'hello' not found in root project 'book_code'. Some candidates are: 'help'.
。
Gradle Wrapper
Gradle Wrapper是对Gradle的一层包装,用于解决开发过程中不同开发者使用不同gradle版本的问题,在一个项目下生成wrapper目录文件之后,这些文件会要求编译构建该项目必须使用的Gradle版本。
Gradle提供了内置的Taskwrapper
用于生成当前Gradle版本的wrapper目录文件。
使用该命令之后,会在当前目录下生成以下文件(文件名+/+d&f,d代表文件夹,f代表文件)
- gralde/d
- wrapper/d
- gradle-wrapper.jar/f
- gradle-wrapper.properties/f
- wrapper/d
- gradlew/f
- gradlew.bat/f
gradlew和gradlew.bat分别是Linux和windows系统下的可执行脚本,其用法和Gradle原生命令一样。而gradle-wrapper.jar是具体业务逻辑实现的jar包,上述的可执行脚本就是使用该jar包实现wrap。gradle-wrapper.properties是配置文件,用于配置使用哪个版本的gradle及其下载地址。
wrapper配置
运行gradle wrapper
任务时有默认配置,当然我们也可以通过两种方式自定义wrapper选项。
指定wrapper任务参数,指定以下参数可以控制wrapper文件的生成
参数名 | 说明 |
---|---|
--gradle-version | 用于指定使用的Gradle版本 |
--gradle-distribution-rul | 用于指定下载Gradle发行版的url地址 |
例如使用gradle wrapper --gradle-version 4.10.3
会指定wrapper使用4.10.3版本的Gradle。
重写任务自定义gradle-wrapper.propeties
,在build.gradle
脚本中通过重写任务wrapper
指定gradle-wrapper.gradle
的配置参数以达到目的。其可配置参数如下表
字段名 | 说明 |
---|---|
distributionBase | 下载的Gradle压缩包解压后存储的主目录 |
distributionPath | 相对于distributionBase解压后的Gradle压缩包的路径 |
zipStoreBase | 同distributionBase,只不过是存放zip压缩包的 |
zipStorePath | 同distributionPath,只不过是存放zip压缩包的 |
distributionURL | Gradle发行版压缩包的下载地址 |
自定义wrapper task,将wrapper task定义在build.gradle
脚本中,运行gradlew任务时会根据任务配置生成wrapper文件目录。
task wrapper( type : Wrapper ) {
gradleVersion = "4.10.3"
}
Gradle日志
执行任务时,可以通过指定输出日志级别来决定显示何种级别的日志。各级别如下
级别 | 用于 |
---|---|
ERROR | 错误信息 |
QUIET | 重要信息 |
WARNING | 警告信息 |
LIFECYCLE | 进度信息 |
INFO | 普通信息 |
DEBUG | 调试信息 |
上表从上到下表示消息级别由重要到普通,例如gradle -w hello
将会显示warning以上级别的信息,包括warning,quiet和error。
输出错误堆栈
我们都知道JVM虚拟是基于堆栈的,当上述日志无法找出错误的时候,就需要输出堆栈信息去查看所有可用信息,命令如下
命令行选项 | 用途 |
---|---|
-s或--stacktrace | 输出关键性的堆栈信息 |
-S或--full-stacktrace | 输出全部堆栈信息 |
正常来说使用-s即可,-S信息太多了。
小结
学习Gradle不要被Gradle繁杂的语法规则吓倒了,直接拿着一个Android或者Java项目的Gradle配置去学习Gradle效率其实很低,还不如从Gradle的基础概念、特性学起。
说白了,Gradle构建过程中起作用就是我们编写的那些脚本文件,它们以Task为单位进行工作。我们使用第三方提供的构建插件库也是以Task为单位对我们的项目进行构建工作的,我们只要了解其概念、如何工作、怎么写怎么改就可以满足开发的基本需求了。
网友评论