构建缓存允许Gradle重用之前任何调用 的任务输出,包括来自其他机器的 任务。Kotlin 1.2.21允许Kotlin项目使用构建缓存。
构建缓存的工作原理是将编译的类、测试输出和其他构建工件存储在缓存中,同时考虑到所有的任务输入,包括输入文件内容、相关的classpaths和任务配置。

这经常导致更快的构建。下图显示了Gradle的部分CI在有和没有构建缓存的情况下的聚合构建时间:

在这篇文章中,我们将解释如何使用Gradle的构建缓存来避免不必要的Kotlin编译,以加快构建速度。
使用Spek的快速演示
你现在就可以尝试用Gradle进行构建缓存。只需遵循以下步骤:
克隆Spek
git clone https://github.com/spekframework/spek.git
cd spek
Spek2.x 分支(默认的)已经具备了我们稍后要介绍的构建缓存的所有先决条件。
构建并填充缓存
下面的命令建立了Spek并填充了本地构建缓存:
❯ ./gradlew assemble --build-cache
BUILD SUCCESSFUL in 10s
21 actionable tasks: 21 executed
使用--build-cache 标志是告诉Gradle将输出存储在单独的任务输出缓存中的一种方法。
删除/改变构建输出
这模拟了在另一台机器上,或许是做了一个改变,然后stashing。最快的演示方法是使用clean 任务:
❯ ./gradlew clean
重新构建并从构建缓存中解析
这次我们重新构建时,所有的Kotlin编译源都会从构建缓存中提取:
❯ ./gradlew assemble --build-cache
BUILD SUCCESSFUL in 2s
21 actionable tasks: 11 executed, 10 from cache
Voilà!你刚刚使用了Gradle的构建缓存来重用Kotlin编译的类,而不是再重新编译!构建的速度大约快了5倍!
你可以从这个构建扫描中看到,Kotlin编译任务是从构建缓存中提取的;而:jar 和:processResources 任务则不是,因为在本地生成JARs和复制文件比从缓存中提取要快。请注意,缓存:test 任务也是支持的。
当CI实例填充一个共享的构建缓存时,Gradle构建缓存特别有效,开发者可以从中提取。下面列出了实现这一目标的更多资源的链接。
为你的项目启用构建缓存
我希望你能兴奋地在你的项目上尝试一下 - 你可以按照以下步骤来启用构建缓存。
首先,你需要确保你使用的是Gradle 4.3或以上版本,这样Kotlin Gradle插件才能选择使用Gradle中的新API。你可以使用Gradle包装器轻松升级Gradle。
接下来,我们需要确保我们是用1.2.20或以上版本的Kotlin来编译的。你可能会在你的buildscript {} 块中声明这样的内容:build.gradle :
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.21"
}
接下来,我们需要告诉Gradle使用构建缓存。有3种方法可以做到这一点:
- 在命令行中使用
--build-cache,启用当前的构建。 - 通过将
org.gradle.caching=true添加到$PROJECT_ROOT/gradle.properties,为项目启用。 - 通过添加
org.gradle.caching=true到$GRADLE_HOME/gradle.properties来为当前用户的所有构建启用。
**注意:**即使设置了android.enableBuildCache=true ,Android开发者仍然需要这么做,因为Gradle的构建缓存与Android的构建缓存是分开的。
我们可以选择性地利用IDE的构建缓存,将运行和测试动作委托给Gradle。
在IntelliJ中启用构建缓存
如果你使用IntelliJ来执行Gradle动作,你需要在你的IDE设置中 "委托IDE构建/运行动作给Gradle",以便在从IntelliJ构建和运行测试时利用构建缓存。

注意:Android Studio 默认会这样做。
缓存kapt任务
kapt 的缓存目前默认是禁用的,即使使用--build-cache ,因为 Gradle 还没有办法为注释处理器映射输入和输出。你可以通过在kapt 配置中把useBuildCache 设置为true ,明确地启用对Kotlin注释处理任务的构建缓存:
kapt {
useBuildCache = true
}
进一步阅读
你可以通过这些资源了解更多关于利用Gradle构建缓存的信息:
总结
使用kotlin-gradle-plugin 1.2.20及以上版本编译Kotlin代码可以利用Gradle的--build-cache 功能来加快开发周期。我们将继续努力扩大支持构建缓存的任务集。
冲!