使用 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 使用构建缓存。有三种方法可以做到这一点。
- 使用命令行上的
--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
功能来加快您的开发周期。工作仍在继续扩展支持构建缓存的任务集。
继续前进!