筆記來源于以下文章:
http://liuwangshu.cn/application/gradle/4-wrapper.html
了解Gradle Wrapper可以更好的理解Gradle,Gradle Wrapper在日常開發(fā)中看似“不起眼”,實則超級重要。
1. 為什么需要Gradle Wrapper
Gradle Wrapper稱為Gradle包裝器,是對Gradle的一層包裝。為什么需要Gradle Wrapper呢?比如在一個開發(fā)團隊中,如果每進來一個成員,都需要在計算機中安裝Gradle,這個時候運行Gradle的環(huán)境和版本就會對構(gòu)建結(jié)果帶來不確定性。針對這個問題,Gradle提供了一個解決方案,那就是Gradle Wrapper,它是一個腳本,可以在計算機沒有安裝Gradle的情況下運行Gradle構(gòu)建,并且能夠指定Gradle的版本,開發(fā)人員可以快速啟動并運行Gradle項目,而不必手動安裝,這樣就標準化了項目,從而提高了開發(fā)效率。AS在新建項目時會自帶Gradle Wrapper,這也是我們很少去單獨去下載安裝Gradle的原因。Gradle Wrapper的工作流程如下圖所示。
當使用Gradle Wrapper啟動Gradle時,如果指定版本的Gradle沒有被下載關聯(lián),會先從Gradle官方倉庫下載該版本Gradle到用戶本地,進行解包并執(zhí)行批處理文件,后續(xù)的構(gòu)建運行都會重用這個解包的運行時安裝程序。
2. Gradle Wrapper
首先要確保計算機中配置好了Gradle的環(huán)境。
Gradle已經(jīng)內(nèi)置了Wrapper Task,執(zhí)行Wrapper Task就可以在項目目錄中生成Gradle Wrapper的目錄文件,在項目根目錄執(zhí)行g(shù)radler 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平臺下,用于執(zhí)行Gralde命令的包裝器腳本。
- gradlew.bat:Windows平臺下,用于執(zhí)行Gralde命令的包裝器腳本。
當生成好了上面的這些目錄與文件后,用戶就可以將工程push到遠程,當其他用戶clone下來后就可以直接進行項目的構(gòu)建,節(jié)省了用戶單獨下載Gradle的時間,并且可以確保Gradle版本的一致。
也可以用Gradle命令行選項來生成Gradle Wrapper
–gradle-version:用于下載和執(zhí)行指定的gradle版本。
–distribution-type:指定下載Gradle發(fā)行版的類型,可用選項有bin和all,默認值是bin,-bin發(fā)行版只包含運行時,但不包含源碼和文檔。
–gradle-distribution-url: 指定下載Gradle發(fā)行版的完整URL地址。
–gradle-distribution-sha256-sum:使用的SHA 256散列和驗證下載的Gradle發(fā)行版。
具體還可以查閱gradle包含的userguide的introduction的Chapter 5. The Gradle Wrapper
比如使用命令行:gradle wrapper –gradle-version 4.2.1 –distribution-type all,就可以生成版本為4.2.1的包裝器,并使用-all發(fā)行版。
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發(fā)行版壓縮包的下載地址。
- zipStoreBase:Gradle壓縮包存儲主目錄。
- zipStorePath:zipStoreBase指定目錄的子目錄。zipStoreBase+zipStorePath就是Gradle壓縮包的存放位置
這里我們最需要關注的是distributionUrl這個字段,如果官方的地址下載不了或者緩慢,可以將這個地址換為其他的鏡像地址,或者干脆把Gradle發(fā)行版壓縮包放在服務器上以供下載。
使用Gradle Wrapper
使用Gradle Wrapper不是用Gradle命令,而是用gradlew和gradlew.bat腳本。在build.gradle中加入如下語句
task test {
doLast {
println 'Hello world!'
}
}
以Windows平臺為例,進入項目的根目錄執(zhí)行 .\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發(fā)行版,Gradle包裝器會將Gradle發(fā)行版壓縮包下載到本地中并進行解壓,比如在我計算機中的存儲路徑為: C:\Users\houyl.gradle\wrapper\dists\gradle-4.4-bin\bgaq7vklkazwgxox0hdadxbvi
如果此后Gradle屬性文件的distributionUrl屬性不變,就會一直使用本地的Gradle發(fā)行版。如果我們再次執(zhí)行g(shù)radlew.bat test,就會和調(diào)用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,只需要運行g(shù)radlew 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
運行g(shù)radlew -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已經(jīng)內(nèi)置了Wrapper Task,因此構(gòu)建Gradle Wrapper會生成Gradle Wrapper的屬性文件,這個屬性文件可以通過自定義Wrapper Task來設置。比如我們想要修改要下載的Gralde版本為4.2.1,可以這么設置:
task wrapper(type: Wrapper) {
gradleVersion = '4.2.1'
}
也可以設置Gradle發(fā)行版壓縮包的下載地址和Gradle解包后的本地存儲路徑等配置。
task wrapper(type: Wrapper) {
gradleVersion = '4.2.1'
distributionUrl = '../../gradle-4.2.1-bin.zip'
distributionPath=wrapper/dists
}
distributionUrl屬性可以設置為本地的項目目錄,你也可以設置為網(wǎng)絡地址。