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 }
推荐读物
你可以通过下列资源来了解更多关于利用 Gradle 构建缓存的信息:
- Configuring the build cache
- Setting up a shared, remote build cache ⚡️
- Debugging build cache misses
- Developing cacheable custom tasks
结论
使用kotlin-gradle-plugin
1.2.20 及以上版本编译 Kotlin 代码,可以利用 Gradle 的--build-cache
功能来加快开发周期。我们正在继续努力来扩展支持构建缓存的任务集。
关于作者
Eric Wendelin是 Gradle 的软件工程师,旨在让软件构建更简单。
查看英文原文: Using Gradle build cache with Kotlin
感谢覃云对本文的审校。
评论