Gradle核心思想(四)看似无用,实则重要的Gradle Wrapper

栏目: 编程工具 · 发布时间: 5年前

内容简介:在本系列的此前文章中,我们学习了为什么要用Gradle、Gradle的入门基础和Groovy的基础,这些文章为Gradle的入门打下了基础,这一篇我们接着学习Gradle Wrapper。有的同学可能有疑问,你不是要讲Android Gradle嘛,讲这个干啥?了解Gradle Wrapper可以更好的理解Gradle,Gradle Wrapper在日常开发中看似“不起眼”,实则超级重要。Gradle Wrapper称为Gradle包装器,是对Gradle的一层包装。为什么需要Gradle Wrapper呢

在本系列的此前文章中,我们学习了为什么要用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核心思想(四)看似无用,实则重要的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、跨平台等技术,还有大厂干货和 程序员 成长类文章。

Gradle核心思想(四)看似无用,实则重要的Gradle Wrapper

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数字战争

数字战争

[英]查尔斯·亚瑟 / 余淼 / 中信出版社 / 2013-6-1 / 49

1998年,数码世界初具雏形。 至此以往,大浪淘沙。随着IT产业的迅猛发展,涌现出了以苹果、谷歌、微软为首的行业巨头。它们为争夺数码世界不同分支的霸主地位而争斗,包括搜索技术、移动音乐、智能手机和平板电脑市场。它们可利用的武器包括硬件、软件以及广告。同时,它们要赌上的则是公司的声望,当然,还有我们的未来。然而,无论在产品创新还是在战略优势上,这些企业彼此竞争、彼此砥砺,推动了行业的良性发展。......一起来看看 《数字战争》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具