在2017年4月,Gradle發(fā)布了build cache的beta版本。構(gòu)建緩存與不斷增長的構(gòu)建特性相互補(bǔ)充。Gradle 4.0版本中,構(gòu)建緩存已經(jīng)準(zhǔn)備好。
build cache 允許Gradle復(fù)用之前任務(wù)調(diào)度的輸出,其中包括其它機(jī)器上的輸出。Kotlin 1.2.21 允許Kotlin工程使用build caching。
構(gòu)建緩存(build cache)的工作原理是:在緩存中存儲已編譯的類、測試輸出和其他構(gòu)建構(gòu)件,同時考慮所有的任務(wù)輸入,包括輸入文件內(nèi)容、相關(guān)類路徑和任務(wù)配置。


在本文我們將會討論如何使用build cache來避免不必要的Kotlin編譯來提高構(gòu)建速度。
Spek的快速demo
按照下面的步驟,你現(xiàn)在就可以使用build cache了:
Clone Spek
git clone https://github.com/spekframework/spek.git
cd spek
分支2.x(默認(rèn)分支)已經(jīng)有了所有的prerequisites for build caching,這些我們后面再討論。
構(gòu)建和填入緩存(Build and populate cache)
下面的代碼將會構(gòu)建Spek并且填入本地的build cache。
? ./gradlew assemble --build-cache
BUILD SUCCESSFUL in 10s
21 actionable tasks: 21 executed
使用--build-cache標(biāo)記是告訴Gradle將輸出保存到一個隔離的輸出棧緩存中的其中一種方式。
移除/更改構(gòu)建輸出
這模擬在另一臺機(jī)器上,或者可能做出改變并將其stash。最快捷的演示方法是使用clean task。
? ./gradlew clean
從構(gòu)建緩存中重新構(gòu)建和解析
這一次,當(dāng)我們重新構(gòu)建時,所有Kotlin編譯的資源都是從構(gòu)建緩存中提取出來的。
? ./gradlew assemble --build-cache
BUILD SUCCESSFUL in 2s
21 actionable tasks: 11 executed, 10 from cache
瞧!您只是使用了Gradle的構(gòu)建緩存來重用Kotlin編譯的類,而不是重新編譯!建造速度大約是5倍快!
從這個構(gòu)建掃描中可以看到,Kotlin編譯任務(wù)是從構(gòu)建緩存中提取出來的;:jar和:processResources任務(wù)不是從緩存中獲取因?yàn)樵诒镜厣蒵ar和復(fù)制文件比從緩存中提取更快。注意,:test緩存也是支持的。
當(dāng)一個CI實(shí)例填充共享的構(gòu)建緩存(開發(fā)人員可以從中提取)時,Gradle構(gòu)建緩存尤其高效。這里有實(shí)現(xiàn)這一目標(biāo)的更多資源的鏈接。
在項目中開啟構(gòu)建緩存(build cache)
我希望你在項目中試下構(gòu)建緩存,可以遵循下面的步驟來開啟構(gòu)建緩存。
第一,保證Gradle版本是4.3或者以上,這樣的話Kotlin Gradle插件能選擇使用新的APIs。使用Gradle wrapper可以輕松更新Gradle。
第二,保證Kotlin版本是1.2.20或者以上。在根目錄下的build.gradle文件的buildscript {}模塊中加上這樣的代碼:
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.21"
}
第三,我們要告訴Gradle我們要使用build cache,這有三種方法:
- 只對當(dāng)前的構(gòu)建開啟,構(gòu)建命令加上參數(shù)
--build-cache即可。 - 只對當(dāng)前工程開啟,在文件
$PROJECT_ROOT/gradle.properties中添加org.gradle.caching=true。 - 對當(dāng)前用戶的所有構(gòu)建都開啟,在文件
$GRADLE_HOME/gradle.properties中添加org.gradle.caching=true。
注意: 即使設(shè)置了android.enableBuildCache=true,開發(fā)者仍然需要做上面的事情,因?yàn)镚radle的構(gòu)建緩存和Android的構(gòu)建緩存是相互獨(dú)立的。
我們可以選擇性地利用IDE的構(gòu)建緩存,將運(yùn)行和測試操作委托給Gradle。
在IntelliJ中開啟構(gòu)建緩存
如果你要IntelliJ執(zhí)行Gradle任務(wù)的話,那么要將IED設(shè)置中的的“Delegate IDE build/run actions to Gradle”開啟來發(fā)揮構(gòu)建緩存的優(yōu)勢。
注意: Android Studio默認(rèn)做了這個東西。
緩存kapt任務(wù)
目前默認(rèn)情況下,對于kapt的緩存是禁用的,即使是使用-build-cache,因?yàn)镚radle沒法為注解處理器映射輸入和輸出。通過在kapt配置中設(shè)置useBuildCache,您可以顯式地啟用Kotlin注解處理任務(wù)的構(gòu)建緩存。
kapt {
useBuildCache = true
}
深入閱讀
您可以通過這些資源了解更多關(guān)于利用Gradle構(gòu)建緩存的知識:
- Configuring the build cache
- Setting up a shared, remote build cache ??
- Debugging build cache misses
- Developing cacheable custom tasks
結(jié)論
使用1.2.20版本及以上的kotlin-gradle-plugin編譯Kotlin代碼的話我們可以發(fā)揮Gradle的構(gòu)建緩存的優(yōu)勢來加速項目的開發(fā)周期。關(guān)于擴(kuò)展支持構(gòu)建緩存任務(wù)的工作會持續(xù)進(jìn)行。
繼續(xù)前進(jìn)!
翻譯自原文: Using Gradle build cache with Kotlin,感覺翻譯的很不好,請批評指正??。
參考文獻(xiàn):
1. Speed up your Build with Gradle Remote Build Cache