gradlew
标签(空格分隔): gradlew
转载自*一篇文章讲清楚Gradle与Gradle Wrapper的区别*
转载自*Gradle之Gradle Wrapper(四)*
gradlew
先简单介绍一下:
下面的介绍简单来说就是gradle会快速迭代版本,如果合作开发项目会导致成员自己下载gradle,导致版本不一,从而手忙脚乱,所以干脆包装起来,统一
转载自*一篇文章讲清楚Gradle与Gradle Wrapper的区别*
因为gradle处于快速迭代阶段,经常发布新版本,如果我们的项目直接去引用,那么更改版本等会变得无比麻烦。而且每个项目又有可能用不一样的gradle版本,这样去手动配置每一个项目对应的gradle版本就会变得麻烦;所以需要包装,引入gradle-wrapper,通过读取配置文件中gradle的版本,为每个项目自动的下载和配置gradle,就是这么简单。我们便不用关心如何去下载gradle,如何去配置进项目来。
那么gradle wrapper从何而来?就Android而言,看下图
在Android Studio安装的时候便会自带这个功能jar包,并且我们也看到了gradle-wrapper.properties。所以我们就知道了,AS每新建一个项目,就会将个目录下的这两个文件拷入到项目的gradle文件夹下面。
当生成好了上面的这些目录与文件后,用户就可以将工程push到远程,当其他用户clone下来后就可以直接进行项目的构建,节省了用户单独下载Gradle的时间,并且可以确保Gradle版本的一致。
但是有人会疑问为什么不直接执行gradle的命令,而是执行gradlew的命令
因为就像wrapper本身的意义,gradle命令行也是善变的,所以wrapper对命令行也进行了一层封装,使用同一的gradlew命令,wrapper会自动去执行具体版本对应的gradle命令
最后还有一个东西说一下,:
.gradle文件夹,就是那个跟项目第一个文件夹,带点的那个。那个对我们没什么用,他是gradle运行的时候产生的一些记录性的文件。我们不需要关注。
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已经内置了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:使用的SHA256散列和验证下载的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解包后存储的主目录。
- 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,在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
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属性可以设置为本地的项目目录,你也可以设置为网络地址。