Gradle之Gradle Wrapper(四)

笔记来源于以下文章:
http://liuwangshu.cn/application/gradle/4-wrapper.html
了解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的工作流程如下图所示。

image

当使用Gradle Wrapper启动Gradle时,如果指定版本的Gradle没有被下载关联,会先从Gradle官方仓库下载该版本Gradle到用户本地,进行解包并执行批处理文件,后续的构建运行都会重用这个解包的运行时安装程序。

2. Gradle Wrapper

首先要确保计算机中配置好了Gradle的环境。
Gradle已经内置了Wrapper Task,执行Wrapper Task就可以在项目目录中生成Gradle Wrapper的目录文件,在项目根目录执行gradler wrapper就可以了。

PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> gradle wrapper

> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
        at build_1oqisdjvwto6xm4npmzdamdyu.run(D:\DevelopSoftWare_Location\Gradle\gradle_demo\build.gradle:1)
        (Run with --stacktrace to get the full stack trace of this deprecation warning.)


BUILD SUCCESSFUL in 2s
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包含的userguide的introduction的Chapter 5. The Gradle Wrapper

比如使用命令行: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.4版本对应的gradle-wrapper.properties如下所示。

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip

字段含义如下:

  • distributionBase:Gradle解包后存储的主目录。
  • distributionPath:distributionBase指定目录的子目录。distributionBase+distributionPath就是Gradle解包后的存放位置。
  • distributionUrl:Gradle发行版压缩包的下载地址。
  • zipStoreBase:Gradle压缩包存储主目录。
  • zipStorePath:zipStoreBase指定目录的子目录。zipStoreBase+zipStorePath就是Gradle压缩包的存放位置

这里我们最需要关注的是distributionUrl这个字段,如果官方的地址下载不了或者缓慢,可以将这个地址换为其他的镜像地址,或者干脆把Gradle发行版压缩包放在服务器上以供下载。

使用Gradle Wrapper

使用Gradle Wrapper不是用Gradle命令,而是用gradlew和gradlew.bat脚本。在build.gradle中加入如下语句

task test {
    doLast {
        println 'Hello world!'
    }
}

以Windows平台为例,进入项目的根目录执行 .\gradlew.bat test,在cmd中不需要加“.\”,在 Windows PowerShell中要加“.\”

PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> .\gradlew.bat test
Downloading https://services.gradle.org/distributions/gradle-4.4-bin.zip
........................................................................
Unzipping C:\Users\houyl\.gradle\wrapper\dists\gradle-4.4-bin\bgaq7vklkazwgxox0hdadxbvi\gradle-4.4-bin.zip to C:\Users\houyl\.gradle\wrapper\dists\gradle-4.4-bin\bgaq7vklkazwgxox0hdadxbvi

> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
        at build_1oqisdjvwto6xm4npmzdamdyu.run(D:\DevelopSoftWare_Location\Gradle\gradle_demo\build.gradle:1)
        (Run with --stacktrace to get the full stack trace of this deprecation warning.)

> Task :test
Hello World


BUILD SUCCESSFUL in 4m 6s
1 actionable task: 1 executed
PS D:\DevelopSoftWare_Location\Gradle\gradle_demo>

如果计算机中没有Gradle发行版,Gradle包装器会将Gradle发行版压缩包下载到本地中并进行解压,比如在我计算机中的存储路径为: C:\Users\houyl.gradle\wrapper\dists\gradle-4.4-bin\bgaq7vklkazwgxox0hdadxbvi
如果此后Gradle属性文件的distributionUrl属性不变,就会一直使用本地的Gradle发行版。如果我们再次执行gradlew.bat test,就会和调用Gradle命令一样:

PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> .\gradlew.bat -q test
Hello World
PS D:\DevelopSoftWare_Location\Gradle\gradle_demo>

5. 升级Gradle Wrapper

升级Gradle Wrapper有两种方式,一种是设置Gradle属性文件的distributionUrl属性,第二种是通过运行wrapper任务,推荐使用第二种方式。当前本地的Gradle版本为4.2.1,我想升级为5.1.1,只需要运行gradlew wrapper –gradle-version 5.1.1命令就可以了。

D:\DevelopSoftWare_Location\Gradle\gradle_demo>gradlew wrapper --gradle-version 5.1.1

> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
        at build_1oqisdjvwto6xm4npmzdamdyu.run(D:\DevelopSoftWare_Location\Gradle\gradle_demo\build.gradle:1)
        (Run with --stacktrace to get the full stack trace of this deprecation warning.)


BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

运行gradlew -v命令来检查Gradle版本

D:\DevelopSoftWare_Location\Gradle\gradle_demo>gradlew -v
Downloading https://services.gradle.org/distributions/gradle-5.1.1-bin.zip
.................................................................................
Unzipping C:\Users\houyl\.gradle\wrapper\dists\gradle-5.1.1-bin\90y9l8txxfw1s2o6ctiqeruwn\gradle-5.1.1-bin.zip to C:\Users\houyl\.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属性可以设置为本地的项目目录,你也可以设置为网络地址。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容

  • https://www.jianshu.com/p/7c288a17cda8 总的来说,Android的系统体系结...
    燕京博士阅读 1,202评论 0 6
  • Gradle是一款非常优秀的构建系统工具,它的DSL基于Groovy实现,可以让你很方便的通过代码控制这些DSL来...
    飞雪无情flysnow_org阅读 3,533评论 0 35
  • 是什么? 在语法上是基于Groovy语言的(Groovy 是一种基于JVM的敏捷开发语言,可以简单的理解为强类型语...
    千山万水迷了鹿阅读 99,580评论 4 122
  • 嗯 早上好 现在是早上8点52 室友都在睡觉,不方便练吉他,心血来潮吧想写一篇简书。 很多人问我怎么练肌肉,怎么把...
    齐天大圣000阅读 285评论 2 0
  • 北国的风吹不散南城的孤寂 于西的墓碑飘满深沉的纪念 大朵鲜花在你满含泪水的双眼里凋零 她不知道你的忧伤飞不过江东之...
    青三木阅读 459评论 1 2