使用 Gradle 构建缓存与 Kotlin

一个 构建缓存 允许 Gradle 重用来自任何先前调用(包括来自其他机器的调用)的任务输出。 Kotlin 1.2.21 允许 Kotlin 项目使用构建缓存。

构建缓存通过将编译的类、测试输出和其他构建工件存储在缓存中来工作,同时考虑所有任务输入,包括输入文件内容、相关类路径和任务配置。

Build Cache topological diagram

这通常会导致更快的构建。下图显示了 Gradle CI 部分使用和不使用构建缓存的聚合构建时间

Build minutes saved with Gradle build cache

在这篇文章中,我们将解释如何使用 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 构建和运行测试时利用构建缓存。

Delegate IDE build/run to Gradle

注意:Android Studio 默认执行此操作。

缓存 kapt 任务

即使使用 --build-cachekapt 的缓存目前默认处于禁用状态,因为 Gradle 还没有方法来映射注释处理器的输入和输出。您可以通过在 kapt 配置中将 useBuildCache 设置为 true 来显式启用对 Kotlin 注释处理任务使用构建缓存。

kapt {
    useBuildCache = true
}

进一步阅读

您可以通过以下资源了解有关利用 Gradle 构建缓存的更多信息。

结论

使用 kotlin-gradle-plugin 版本 1.2.20 及更高版本编译 Kotlin 代码可以利用 Gradle 的 --build-cache 功能来加快您的开发周期。工作仍在继续扩展支持构建缓存的任务集。

继续前进!

讨论