iT邦幫忙

2021 iThome 鐵人賽

DAY 9
2
Software Development

Gradle 通靈術系列 第 9

第九天:使用 Gradle Wrapper

在開發 JVM 專案時,有時會遇到這些實務問題:

  1. 專案使用的 Gradle 版本跟自己本機安裝的不同
  2. 參與專案開發的每位成員使用的 Gradle 版本都不同
  3. 團隊維護多個專案,每個專案使用的 Gradle 版本不同

這對團隊開發來說增加了複雜度,有可能因不同版本的 Gradle 而增加建置失敗的風險。

Gradle Wrapper 來解救

為了避免這種 Gradle 大亂鬥的問題,Gradle 官方推出了一種名為 Gradle Wrapper 的方案,其作法就是在專案裡放一個可攜的腳本,這個腳本可以指定專案使用的 Gradle 版本,並在使用前自動下載並載入執行環境裡。使用 Gradle Wrapper 帶來幾個好處:

  1. 開發者可以不用在本機安裝 Gradle,節省設定專案的時間
  2. 標準化專案的 Gradle 版本,確保專案在建置的時候可以使用版本一致的 Gradle,讓專案在建置時更可靠與堅固
  3. 當要升級版本或是切換執行環境時,只需要修改 Wrapper 設定就能輕鬆達成

這種使用 Gradle Wrapper 的方式,已變成官方建議的標準作法。

在現有專案增加 Gradle Wrapper

雖然大多數的專案在建立時都已經預設採用 Gradle Wrapper,但假如是維護舊專案,需要導入 Gradle Wrapper 時,可以透過指令讓專案支援 Wrapper:

$ gradle wrapper

當專案安裝好 Gradle Wrapper 後,目錄結構會看起來像這樣:

├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── build.gradle.kts
├── settings.gradle.kts
├── gradlew
└── gradlew.bat

  • 根目錄底下的 gradlewgradlew.bat 是分別給 Unix-like 及 Windows 作業系統用的執行腳本
  • gradle/wrapper/gradle-wrapper.jar 是下載 Gradle 執行檔的核心程式
  • gradle/wrapper/gradle-wrapper.properties 則是用來紀錄 Wrapper 的設定檔,比方說 Version、Distribution Type(allbin)等

使用 Gradle Wrapper

當我們使用 Gradle Wrapper 時,就不再是使用之前提到的 gradle 指令,而是依照作業系統改用 ./gradlewgradlew.bat 指令。Gradle Wrapper 會依照 gradle/wrapper/gradle-wrapper.properties 的設定值,到 Gradle 官網下載對應版本的 Gradle 執行檔下來,以類似 Portable 的方式來執行各種指令。Gradle Wrapper 的運作流程可以參考官網的這張說明:

升級 Gradle Wrapper

假如手上專案使用的 Gradle Wrapper 版本過舊想要升級,Gradle 也有對應的升級指令:

$ ./gradlew wrapper --gradle-version 7.2

有了 Wrapper 後,我還需要在本機裝 Gradle 嗎?

看到這邊您可能會很疑惑,既然 Gradle 官方都推薦使用 Gradle Wrapper 了,那我們還需要在本機安裝 Gradle 嗎?(而且還學了 5 種方式耶!)

答案是:看情況。

假如您只需要維護已經裝好 Gradle Wrapper 的專案的話,那的確是不需要在本機安裝 Gradle。反之,假如你會需要在本機用 Gradle 建立一個全新的專案的話,那就還是得安裝 Gradle 喔!

當然,還是有幾個例外。假如您是使用 IntelliJ IDEA 或 Android Studio 來建立專案的話,這些 IDE 都已經內建 Gradle,所以本機就可以不用安裝 Gradle。另外也提醒一下,即便 Gradle Wrapper 可以很聰明方便的下載與運行 Gradle,但開發機上該有的 JDK 執行環境還是要有喔!

參考資料


上一篇
第八天:用 Docker 運行 Gradle
下一篇
第十天:安裝 IntelliJ IDEA
系列文
Gradle 通靈術24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言