Gradle核心思想(四)看似無用,實則重要的Gradle Wrapper

關聯文章
Gradle核心思想(一)爲什麼現在要用Gradle?
Gradle核心思想(二)Gradle入門前奏
Gradle核心思想(三)Groovy快速入門指南
Gradle核心思想(四)看似無用,實則重要的Gradle Wrapper
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、跨平臺等技術,關注職業發展和行業動態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章