在Kotlin中使用Gradle構建緩衝
Kotlin 1.2.21允許Kotlin項目使用構建緩衝。通過Gradle的構建緩衝功能,可以提升Kotlin代碼的編譯速度,加快開發週期。本文將結合實際例子,介紹利用Gradle加速Kotlin代碼編譯的原理、配置樣本以及在IDE中的使用方法。
構建緩衝允許Gradle可以複用任何之前調用(包括那些來自其它機器的調用)的任務產出。Kotlin 1.2.21允許Kotlin項目使用構建緩衝。
構建緩衝的工作原理是在緩衝中儲存編譯過的類、測試結果和其它構建工序,同時記錄所有的任務輸入,包括輸入檔案內容、相關的類路徑和任務配置。
這常常導致更快的構建。下面的表徵圖展示了在Gradle的持續整合中使用構建緩衝和不使用構建緩衝所收集到的構建時間:
本文中,我們將向你闡述,如何使用Gradle的構建緩衝來避免不必要的Kotlin編譯,從而加快你的構建過程。
Spek快速樣本
你現在就可以嘗試使用Gradle的構建緩衝。只需要遵循下面幾個步驟:
Clone Spek
git clone https://github.com/spekframework/spek.git
cd spek
Spek 2.x
分支(其預設分支)已經有我們後續要介紹的構建緩衝的所有先決條件。
構建和填充緩衝
下面的命令會構建Spek並填充本地構建緩衝。
❯ ./gradlew assemble --build-cache
BUILD SUCCESSFUL in 10s
21 actionable tasks: 21 executed
使用--build-cache
標識,可以讓Gradle在一個獨立的任務結果緩衝中儲存任務結果。
刪除/更改構建結果
這類比了在另一台機器上的情況或者做了一次改變並stash
(儲存)這次改變的情況。示範的最快方法是使用clean
任務。
❯ ./gradlew clean
從構建緩衝中重新構建
當我們重新構建時,從構建緩衝中拉取所有編譯過的Kotlin源碼。
❯ ./gradlew assemble --build-cache
BUILD SUCCESSFUL in 2s
21 actionable tasks: 11 executed, 10 from cache
就是這樣!通過使用Gradle的構建緩衝,你重用了編譯過的Kotlin類,而不是又重新編譯!構建速度差不多快了5倍!
你可以從這次構建觀測中看到,Kotlin編譯任務從構建緩衝中拉取緩衝結果;而:jar
和:processResources
任務沒有從緩衝中拉取,因為它們本地產生JAR包和複製檔案的速度比從緩衝中拉取緩衝結果的速度更快。另外Gradle構建緩衝也支援緩衝:test
任務。
當持續整合的一個執行個體填充了一個共用的構建緩衝(開發人員可以從中拉取)時,Gradle構建緩衝會特別有效。下文羅列了實現這點的更多資源的連結。
為你的項目啟用構建緩衝我希望你會在自己的項目上嘗試使用構建緩衝——你可以遵循下面的步驟來啟用構建緩衝。
首先,你需要確保正在使用Gradle 4.3或者更高版本,這樣才能選擇Kotlin Gradle Plugin來使用新的Gradle APIs。你可以方便地使用Gradle wrapper升級Gradle。
然後,你需要確保正在使用Kotlin 1.2.20或更高版本來進行編譯。你在自己的構建指令碼build.gradle
中的buildscript {}
塊中配置類似如下的聲明:
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.21"
}
然後,我們需要讓Gradle使用構建緩衝。有3種啟用構建緩衝的方法:
- 在命令列中使用--build-cache來為當前構建啟用構建緩衝。
- 在$PROJECT_ROOT/gradle.properties中增加org.gradle.caching=true來為整個項目啟用構建緩衝。
- 在$GRADLE_HOME/gradle.properties中增加org.gradle.caching=true來為目前使用者的所有構建啟用構建緩衝。
注意: Android開發人員即使設定了android.enableBuildCache=true
,也仍需要按照上述方法啟用構建緩衝,因為Gradle的構建緩衝是獨立於Android的構建緩衝的。
我們可以選擇通過將run和test actions委派給Gradle的方式,來利用IDE的構建緩衝。
在IntelliJ中啟用構建緩衝如果你使用IntelliJ來執行Gradle actions,你需要在IDE配置中勾選“Delegate IDE build/run actions to Gradle(將IDE 構建/運行動作委派給Gradle)”,從而在IntelliJ中構建和運行測試時利用構建緩衝。
注意: Android Studio預設這樣做。
緩衝kapt任務目前即使使用--build-cache
,針對kapt
的緩衝也預設是禁用的,因為Gradle還沒有一種方法來映射註解處理器的輸入和輸出。你可以通過在kapt
配置中將useBuildCache
設定為true
來明確啟用針對Kotlin註解處理任務的構建緩衝。
kapt {
useBuildCache = true
}
推薦讀物你可以通過下列資源來瞭解