使用 Gradle 构建缓存与 Kotlin

目录

  • 为你的项目启用构建缓存
  • 在 IntelliJ 中启用构建缓存
  • 缓存 kapt 任务
  • 进一步阅读
  • 结论
  • 简介

    构建缓存 允许 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 Wrapper 轻松升级 Gradle。

    接下来,我们需要确保我们使用 Kotlin 1.2.20 或更高版本进行编译。你可能在 build.gradlebuildscript {} 代码块中声明了类似以下内容

    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 构建和运行测试时利用构建缓存。

    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 功能来加速你的开发周期。 扩展支持构建缓存的任务集的工作仍在继续。

    前进!

    讨论