Gradle 简易入门教程
Gradle
是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于 Groovy
(现在也支持 Kotlin
)的内部领域特定语言。
Gradle 特点
- Gradle是很成熟的技术,可以处理大规模构建
- Gradle对多语言、多平台支持性更好
- Gradle关注在构建效率上
- Gradle发布很频繁,重要feature开发计划透明化
- Gradle社区很活跃,并且增加迅速
安装Gradle
- 从 这个页面 下载二进制文件。
- 解压Zip文件,加入环境变量(在PATH中加入GRADLE_HOME/bin目录)
如果在安装过程中遇到问题,可以进一步查看官方的 安装指南。
最后验证一下 Gradle
是否工作正常
1 | gradle -v |
Gradle 快速体验
初始化一个项目
- 创建一个
demo
目录1
❯ mkdir gradle-demo
- 创始化
Gradle
项目1
2
3
4
5❯ gradle init
Starting a Gradle Daemon (subsequent builds will be faster)
BUILD SUCCESSFUL in 3s
2 actionable tasks: 2 executed
Gradle 目录结构
我们看看上一步我们生成了什么文件
1 | ├── build.gradle ❶ |
❶ 当前项目的配置脚本
➋ Gradle Wrapper
的执行jar包(后续介绍)
➌ Gradle Wrapper
的配置文件
➍ Gradle Wrapper
Unix 系执行脚本
➎ Gradle Wrapper
Windows 系执行脚本
➏ 项目脚本设置
创建一个 Task
Gradle
提供了用于通过基于Groovy
或Kotlin
的DSL创建和配置。项目包括一组Task
,每个Task
执行一些基本操作。
- 创建一个目录叫
src
- 在
src
目录创建一个myfile.txt
- 在构建文件中定义一个名为Copy的类型
Task
,该任务将src目录复制到名为dest的新目录
1 | task copy(type: Copy, group: "Custom", description: "Copies sources to the dest directory") { |
1 | tasks.create<Copy>("copy") { |
group
和 description
是自定义的任意值。现在让我们执行这个 task
1 | ❯ ./gradlew copy |
再一次 ls
我们就可以看见 gradle
为我们创建了一个新的 dest
目录并且将 文件复制进去
Gradle Task
在Gradle
中,有两个基本概念:项目和任务。
- 项目是指我们的构建产物(比如Jar包)或实施产物(将应用程序部署到生产环境)一个项目包含一个或多个任务。
- 任务是指不可分的最小工作单元,执行构建工作(比如编译项目或执行测试)。
在项目目录中的 build.gradle
指定了一个项目和它的任务。
Task 执行顺序
任务可能依赖于其他任务,或者可能被安排为始终在另一个任务之后运行。
1 | project('projectA') { |
1 | > gradle -q taskX |
我们可以用 dependsOn
让我们的 Task
有顺序的运行起来
Task 文档
Gradle 插件
看到这里,如果每一件事情我们都需要写 Task
岂不是会累死,而且很多功能是可以被复用的,所以Gradle
提供一个 插件
功能,Gradle
默认就内置了大量的插件,比如在 base
中有一系列的功能。
1 | plugins { |
1 | plugins { |
这个时候我们就可以利用一些额外的 Task
,举个例子,我们要把一个目录中的东西都打成一个 ZIP
压缩包。
1 | task zip(type: Zip, group: "Archive", description: "Archives sources in a zip file") { |
1 | tasks.create<Zip>("zip") { |
Gradle
的设计理念是
- 在项目中添加新任务
- 为新加入的任务提供默认配置,这个默认配置会在项目中注入新的约定(如源文件位置)。
- 加入新的属性,可以覆盖插件的默认配置属性。
- 为项目加入新的依赖。
Gradle Java
Gradle
内置了 Java
插件,Java插件将Java编译以及测试和捆绑功能添加到项目中。它是许多其他Gradle插件的基础。
如果我们需要使用 Java
插件 修改 build.gradle
1 | plugins { |
一旦导入了 Java 插件,就会有一系列的默认的配置值,并且会导入大量的 Task
Task | 含义 |
---|---|
compileJava(type: JavaCompile) | Java 编译 |
processResources(type: Copy) | 拷贝 Resources 资源 |
classes(type: Task) | 组装 Java 类 |
compileTestJava(type: JavaCompile) | Java Test 编译 |
processTestResources(type: Copy) | 拷贝 Test Resources 资源 |
testClasses(type: Task) | 组装 Test 类 |
jar(type: Jar) | 合成Jar包 |
javadoc(type: Javadoc) | 生成 doc 文档 |
test(type: Test) | 运行测试 |
uploadArchives(type: Upload) | 上传 jar 到仓库 |
clean(type: Delete) | clean |
我们从这些 Task
名字就可以看出来他们分别作作了, 和其他的设计理念类型,在 Task
也会嵌入一些生命周期,其实原理也就是我们之前看的执行顺序。Java Lifecycle
资源
Gradle 依赖管理
先盗取一张官方的图
和 Maven
类似,Gradle
也会将依赖缓冲在本地中,方便在无网的环境使用,和依赖管理相关的有两个参数,举个例子。
1 | repositories { |
Gradle支持以下仓库格式:
- Ivy仓库
- Maven仓库
- Flat directory仓库
lvy仓库
我们可以通过URL地址或本地文件系统地址,将Ivy仓库加入到我们的构建中。
1 | repositories { |
Maven仓库
1 | repositories { |
在加入Maven仓库时,Gradle提供了三种“别名”供我们使用,它们分别是
mavenCentral()
别名,表示依赖是从Central Maven 2 仓库中获取的。jcenter()
别名,表示依赖是从Bintary’s JCenter Maven 仓库中获取的。mavenLocal()
别名,表示依赖是从本地的Maven仓库中获取的。
Flat Directory仓库
1 | repositories { |
依赖管理
在配置完项目仓库后,我们可以声明其中的依赖,首先 Java
插件指定了若干依赖配置项
compile
配置项中的依赖是依赖必须的。runtime
配置项中包含的依赖在运行时是必须的。testCompile
配置项中包含的依赖在编译项目的测试代码时是必须的。testRuntime
配置项中包含的依赖在运行测试代码时是必须的。
在 Gradle
最新版本中更是增加
implementation
配置项中的实现类api
配置项中的暴露API
1 | dependencies { |
声明项目依赖
最普遍的依赖称为外部依赖,这些依赖存放在外部仓库中。一个外部依赖可以由以下属性指定:
group
属性指定依赖的分组(在Maven
中,就是groupId
)name
属性指定依赖的名称(在Maven
中,就是artifactId
)version
属性指定外部依赖的版本(在Maven
中,就是version
)
1 | dependencies { |
声明项目文件依赖
我们如何依赖本地的一些 jar
呢,正确的操作是如下
1 | dependencies { |
声明依赖排除项目
我们都知道在 Maven
中我们有
1 | <dependency> |
而在 Gradle
中,我们可以这么做。
1 | compile('com.example.m:m:1.0') { |
Gradle 与 Kotlin
我们想要在 gradle
中增加 kotlin
非常的简单,仅仅需要在 build.gradle
增加
1 | plugins { |
大功告成,对了,默认的 Kotlin
的源码路径是 src/main/kotlin
, 测试源码是 src/text/kotlin
如果需要修改可以使用
1 | sourceSets { |
其他
Gradle Wrapper
Gradle Wrapper
做了三件事情
- 解析参数传入 gradlew
- 安装正确的
Gradle
版本 - 调用
Gradle
执行命令
Ops,Gradle Wrapper
为什么还需要安装 Gradle
,我们在用 Maven
都知道,我们需要自己先安装好一个 Maven
版本,因为 Maven
发展多年,现在已经稳定,已经不存在很多个版本并存的现状了,但是我们依然需要去在每个机器上去安装,那我什么我们不能在自己的 构建脚本
中就指定我们的构建工具呢?
所以我们在 wrapper/gradle-wrapper.properties
中就可以发现 distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip
这里也就是定义了我们的gradle所使用的版本。
Gradle In Real World
1 | // 定义一堆基础插件 |
Gradle 常用指令
枚列所有可用任务
1 | ❯ gradle tasks |
构建配置属性
1 | ❯ gradle properties |
显示构建详情
在 build.gradle
设置
1 | logging.level = LogLevel.DEBUG |
或者在运行的
1 | ❯ gradle build --stacktrace |