使用 Gradle 构建缓存与 Kotlin
引言
一个 构建缓存 允许 Gradle 重用任何先前调用的任务输出,包括来自其他机器的输出。 Kotlin 1.2.21 允许 Kotlin 项目使用构建缓存。
构建缓存通过将编译的类、测试输出和其他构建工件存储在缓存中来工作,同时考虑所有任务输入,包括输入文件内容、相关类路径和任务配置。
这通常会带来更快的构建。下面的图表显示了 Gradle CI 的一部分在启用和未启用构建缓存时的聚合构建时间。
在本文中,我们将解释如何使用 Gradle 的构建缓存来避免不必要的 Kotlin 编译,以加快您的构建速度。
使用 Spek 进行快速演示 #
您可以立即尝试 Gradle 的构建缓存。只需按照以下步骤操作:
克隆 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 文件和复制文件到本地比从缓存中拉取更快。请注意,缓存:test
任务也受支持。
当 CI 实例填充一个共享构建缓存供开发人员拉取时,Gradle 构建缓存尤其有效。下面列出了实现此目的的更多资源的链接。
为您的项目启用构建缓存 #
希望您能兴奋地在您的项目上尝试此功能 — 您可以按照以下步骤启用构建缓存。
首先,您需要确保使用的是 Gradle 4.3 或更高版本,以便 Kotlin Gradle 插件可以选用 Gradle 中的新 API。您可以使用Gradle 包装器轻松升级 Gradle。
接下来,我们需要确保我们使用的是 Kotlin 版本 1.2.20 或更高版本。您可能在 build.gradle
的 buildscript {}
块中声明了类似以下内容:
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 构建缓存是分开的。
我们可以通过将运行和测试操作委托给 Gradle 来选择性地利用 IDE 的构建缓存。
在 IntelliJ 中启用构建缓存 #
如果您使用 IntelliJ 来执行 Gradle 操作,则需要在 IDE 设置中选择“将 IDE 构建/运行操作委托给 Gradle”,以便在从 IntelliJ 构建和运行测试时利用构建缓存。
注意: Android Studio 默认会执行此操作。
缓存 kapt 任务 #
目前,即使启用了 --build-cache
,kapt
的缓存默认是禁用的,因为 Gradle 还没有一种方法来映射注解处理器的输入和输出。您可以通过在 kapt
配置中将 useBuildCache
设置为 true
来显式启用 Kotlin 注解处理任务的构建缓存使用。
kapt {
useBuildCache = true
}
深入阅读 #
您可以通过以下资源了解更多关于利用 Gradle 构建缓存的信息:
结论 #
使用 kotlin-gradle-plugin
1.2.20 及以上版本编译 Kotlin 代码可以利用 Gradle 的 --build-cache
功能来加速您的开发周期。我们正继续努力扩展支持构建缓存的任务范围。
继续前进!