本文首发于微信公众号「刘望舒」
关联文章
Gradle 核心思想 (一) 为什么现在要用 Gradle?
Gradle 核心思想(二)Gradle 入门前奏
Gradle 核心思想(三)Groovy 快速入门指南
Gradle 核心思想 (五) 通俗易懂的 Gradle 插件讲解
前言
在本系列的此前文章中, 我们学习了为什么要用 Gradle,Gradle 的入门基础和 Groovy 的基础, 这些文章为 Gradle 的入门打下了基础, 这一篇我们接着学习 Gradle Wrapper. 有的同学可能有疑问, 你不是要讲 Android Gradle 嘛, 讲这个干啥? 了解 Gradle Wrapper 可以更好的理解 Gradle,Gradle Wrapper 在日常开发中看似 "不起眼", 实则超级重要.
1. 为什么需要 Gradle Wrapper
Gradle Wrapper 称为 Gradle 包装器, 是对 Gradle 的一层包装. 为什么需要 Gradle Wrapper 呢? 比如在一个开发团队中, 如果每进来一个成员, 都需要在计算机中安装 Gradle, 这个时候运行 Gradle 的环境和版本就会对构建结果带来不确定性. 针对这个问题, Gradle 提供了一个解决方案, 那就是 Gradle Wrapper, 它是一个脚本, 可以在计算机没有安装 Gradle 的情况下运行 Gradle 构建, 并且能够指定 Gradle 的版本, 开发人员可以快速启动并运行 Gradle 项目, 而不必手动安装, 这样就标准化了项目, 从而提高了开发效率. AS 在新建项目时会自带 Gradle Wrapper, 这也是我们很少去单独去下载安装 Gradle 的原因. Gradle Wrapper 的工作流程如下图所示.
当使用 Gradle Wrapper 启动 Gradle 时, 如果指定版本的 Gradle 没有被下载关联, 会先从 Gradle 官方仓库下载该版本 Gradle 到用户本地, 进行解包并执行批处理文件. 后续的构建运行都会重用这个解包的运行时安装程序.
2. 构建 Gradle Wrapper
首先要确保计算机中配置好了 Gradle 的环境, 没有的话可以参考 Gradle 核心思想(二)Gradle 入门前奏这篇文章去配置 Gradle 的环境. Gradle 已经内置了 Wrapper Task, 执行 Wrapper Task 就可以在项目目录中生成 Gradle Wrapper 的目录文件. 在项目根目录执行 gradle wrapper 就可以了.
- $ gradle wrapper
- > Task :wrapper
- BUILD SUCCESSFUL in 0s
- 1 actionable task: 1 executed
这时会在项目根目录中生成如下文件:
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat
每个文件的含义如下:
gradle-wrapper.jar : 包含 Gradle 运行时的逻辑代码.
gradle-wrapper.properties : 负责配置包装器运行时行为的属性文件, 用来配置使用哪个版本的 Gradle 等属性.
gradlew:Linux 平台下, 用于执行 Gralde 命令的包装器脚本.
gradlew.bat:Windows 平台下, 用于执行 Gralde 命令的包装器脚本.
当生成好了上面的这些目录与文件后, 用户就可以将工程 push 到远程, 当其他用户 clone 下来后就可以直接进行项目的构建, 节省了用户单独下载 Gradle 的时间, 并且可以确保 Gradle 版本的一致.
也可以用 gradle 命令行选项, 来生成 gradle wrapper. --gradle-version: 用于下载和执行指定的 gradle 版本. --distribution-type: 指定下载 Gradle 发行版的类型, 可用选项有 bin 和 all, 默认值是 bin,-bin 发行版只包含运行时, 但不包含源码和文档. --gradle-distribution-url: 指定下载 Gradle 发行版的完整 URL 地址. --gradle-distribution-sha256-sum: 使用的 SHA 256 散列和验证下载的 Gradle 发行版.
比如使用命令行: gradle wrapper --gradle-version 4.2.1 --distribution-type all, 就可以生成版本为 4.2.1 的包装器, 并使用 - all 发行版.
3. 配置 Gradle Wrapper
gradle-wrapper.properties 是 Gradle Wrapper 的属性文件, 用来配置 Gradle Wrapper,Gradle 4.2.1 版本对应的 gradle-wrapper.properties 如下所示.
- distributionBase=GRADLE_USER_HOME
- distributionPath=wrapper/dists
- distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip
- zipStoreBase=GRADLE_USER_HOME
- zipStorePath=wrapper/dists
字段的含义如下:
distributionBase:Gradle 解包后存储的主目录.
distributionPath:distributionBase 指定目录的子目录. distributionBase+distributionPath 就是 Gradle 解包后的存放位置.
distributionUrl:Gradle 发行版压缩包的下载地址.
zipStoreBase:Gradle 压缩包存储主目录.
zipStorePath:zipStoreBase 指定目录的子目录. zipStoreBase+zipStorePath 就是 Gradle 压缩包的存放位置.
这里我们最需要关注的是 distributionUrl 这个字段, 如果官方的地址下载不了或者缓慢, 可以将这个地址换为其他的镜像地址, 或者干脆把 Gradle 发行版压缩包放在服务器上以供下载.
4. 使用 Gradle Wrapper
使用 Gradle Wrapper 不是用 Gradle 命令, 而是用 gradlew 和 gradlew.bat 脚本. 在 build.gradle 中加入如下语句:
- task test {
- doLast {
- println 'Hello world!'
- }
- }
以 Windows 平台为例, 我们进入项目所在的根目录执行 gradlew.bat test:
- f:\App>gradlew.bat test
- Downloading https://services.gradle.org/distributions/gradle-4.2.1-bin.zip
- ...................................................................
- Starting a Gradle Daemon (subsequent builds will be faster)
- > Task :test
- Hello world!
如果计算机中没有 Gradle 发行版, Gradle 包装器会将 Gradle 发行版压缩包下载到本地中并进行解压, 比如在我计算机中的存储路径为: C:\Users\52501.gradle\wrapper\dists\gradle-4.2.1-bin\dajvke9o8kmaxbu0kc5gcgeju\gradle-4.2.1. 如果此后 Gradle 属性文件的 distributionUrl 属性不变, 就会一直使用本地的 Gradle 发行版. 如果我们再次执行 gradlew.bat test, 就会和调用 Gradle 命令一样:
- f:\App>gradlew.bat test
- Starting a Gradle Daemon (subsequent builds will be faster)
- > Task :test
- Hello world!
5. 升级 Gradle Wrapper
升级 Gradle Wrapper 有两种方式, 一种是设置 Gradle 属性文件的 distributionUrl 属性, 第二种是通过运行 wrapper 任务, 推荐使用第二种方式. 当前本地的 Gradle 版本为 4.2.1, 我想升级为 5.1.1, 只需要运行 gradlew wrapper --gradle-version 5.1.1 命令就可以了.
- f:\App>gradlew wrapper --gradle-version 5.1.1
- BUILD SUCCESSFUL in 1s
- 1 actionable task: 1 executed
运行 gradlew -v 命令来检查 Gradle 的版本.
- f:\App>gradlew -v
- Downloading https://services.gradle.org/distributions/gradle-5.1.1-bin.zip
- .................................................................................
- Unzipping C:\Users\52501\.gradle\wrapper\dists\gradle-5.1.1-bin\90y9l8txxfw1s2o6ctiqeruwn\gradle-5.1.1-bin.zip to C:\Users\52501\.gradle\wrapper\dists\gradle-5.1.1-bin\90y9l8txxfw1s2o6ctiqeruwn
- Welcome to Gradle 5.1.1!
- Here are the highlights of this release:
- - Control which dependencies can be retrieved from which repositories
- - Production-ready configuration avoidance APIs
- For more details see https://docs.gradle.org/5.1.1/release-notes.html
- ------------------------------------------------------------
- Gradle 5.1.1
- ------------------------------------------------------------
- Build time: 2019-01-10 23:05:02 UTC
- Revision: 3c9abb645fb83932c44e8610642393ad62116807
- Kotlin DSL: 1.1.1
- Kotlin: 1.3.11
- Groovy: 2.5.4
- Ant: Apache Ant(TM) version 1.9.13 compiled on July 10 2018
- JVM: 1.8.0_191 (Oracle Corporation 25.191-b12)
- OS: Windows 10 10.0 amd64
由于本地不是 Gradle 5.1.1, 会将下载下来的 Gradle 压缩包存储起来并进行解包, 具体的见上面的打印日志.
6. 自定义 Gradle Wrapper
Gradle 已经内置了 Wrapper Task, 因此构建 Gradle Wrapper 会生成 Gradle Wrapper 的属性文件, 这个属性文件可以通过自定义 Wrapper Task 来设置. 比如我们想要修改要下载的 Gralde 版本为 4.2.1, 可以这么设置:
- task wrapper(type: Wrapper) {
- gradleVersion = '4.2.1'
- }
也可以设置 Gradle 发行版压缩包的下载地址和 Gradle 解包后的本地存储路径等配置.
- task wrapper(type: Wrapper) {
- gradleVersion = '4.2.1'
- distributionUrl = '../../gradle-4.2.1-bin.zip'
- distributionPath=wrapper/dists
- }
distributionUrl 属性可以设置为本地的项目目录, 你也可以设置为网络地址.
不仅分享大前端, Java,Android, 跨平台等技术, 还有大厂干货和程序员成长类文章.
来源: https://juejin.im/post/5c9395bcf265da612c3a3def