使用 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 Wrapper 轻松升级 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
功能来加速你的开发周期。 扩展支持构建缓存的任务集的工作仍在继续。
前进!