结合Kotlin使用Gradle build cache

Posted 程序员与你谈人生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结合Kotlin使用Gradle build cache相关的知识,希望对你有一定的参考价值。

build cache 允许Gradle复用之前任务调度的输出,其中包括其它机器上的输出。Kotlin 1.2.21 允许Kotlin工程使用build caching。


构建缓存(build cache)的工作原理是:在缓存中存储已编译的类、测试输出和其他构建构件,同时考虑所有的任务输入,包括输入文件内容、相关类路径和任务配置。

这样的话android studio构建会更快。下面的图表分别显示了Gradle持续集成时使用构建缓存和不使用构建缓存两种情况下的聚合的构建时间:

在本文我们将会讨论如何使用build cache来避免不必要的Kotlin编译来提高构建速度。


Spek的快速demo

按照下面的步骤,你现在就可以使用build cache了:


Clone Spek

git clone https://github.com/spekframework/spek.git
cd spek


分支2.x(默认分支)已经有了所有的prerequisites for build caching,这些我们后面再讨论。


构建和填入缓存(Build and populate cache)

下面的代码将会构建Spek并且填入本地的build cache。

❯ ./gradlew assemble --build-cache
 
BUILD SUCCESSFUL in 10s
21 actionable tasks: 21 executed


使用--build-cache标记是告诉Gradle将输出保存到一个隔离的输出栈缓存中的其中一种方式。


移除/更改构建输出

这模拟在另一台机器上,或者可能做出改变并将其stash。最快捷的演示方法是使用clean task。

❯ ./gradlew clean


从构建缓存中重新构建和解析

这一次,当我们重新构建时,所有Kotlin编译的资源都是从构建缓存中提取出来的。

❯ ./gradlew assemble --build-cache
 
BUILD SUCCESSFUL in 2s21 actionable tasks: 11 executed, 10 from cache


瞧!您只是使用了Gradle的构建缓存来重用Kotlin编译的类,而不是重新编译!建造速度大约是5倍快!


从这个构建扫描中可以看到,Kotlin编译任务是从构建缓存中提取出来的;:jar和:processResources任务不是从缓存中获取因为在本地生成jar和复制文件比从缓存中提取更快。注意,:test缓存也是支持的。


当一个CI实例填充共享的构建缓存(开发人员可以从中提取)时,Gradle构建缓存尤其高效。这里有实现这一目标的更多资源的链接。



在项目中开启构建缓存(build cache)

我希望你在项目中试下构建缓存,可以遵循下面的步骤来开启构建缓存。


第一,保证Gradle版本是4.3或者以上,这样的话Kotlin Gradle插件能选择使用新的APIs。使用Gradle wrapper可以轻松更新Gradle。


第二,保证Kotlin版本是1.2.20或者以上。在根目录下的build.gradle文件的buildscript {}模块中加上这样的代码:

dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.21"
}


第三,我们要告诉Gradle我们要使用build cache,这有三种方法:

  1. 只对当前的构建开启,构建命令加上参数--build-cache即可。

  2. 只对当前工程开启,在文件$PROJECT_ROOT/gradle.properties中添加org.gradle.caching=true。

  3. 对丹铅用户的所有构建都开启,在文件$GRADLE_HOME/gradle.properties中添加org.gradle.caching=true。


注意: 即使设置了android.enableBuildCache=true,开发者仍然需要做上面的事情,因为Gradle的构建缓存和Android的构建缓存是相互独立的。


我们可以选择性地利用IDE的构建缓存,将运行和测试操作委托给Gradle。



在IntelliJ中开启构建缓存

如果你要IntelliJ执行Gradle任务的话,那么要将IED设置中的的“Delegate IDE build/run actions to Gradle”开启来发挥构建缓存的优势。

注意: Android Studio默认做了这个东西。


缓存kapt任务

目前默认情况下,对于kapt的缓存是禁用的,即使是使用-build-cache,因为Gradle没法为注解处理器映射输入和输出。通过在kapt配置中设置useBuildCache,您可以显式地启用Kotlin注解处理任务的构建缓存。

kapt {
  useBuildCache = true
}


深入阅读

您可以通过这些资源了解更多关于利用Gradle构建缓存的知识:

  • Configuring the build cache:https://docs.gradle.org/current/userguide/build_cache.html#sec:build_cache_configure

  • Setting up a shared, remote build cache:https://docs.gradle.org/current/userguide/build_cache.html#sec:build_cache_configure_remote

  • Debugging build cache misses:https://guides.gradle.org/using-build-cache/#debugging_and_diagnosing_cache_misses

  • Developing cacheable custom tasks:https://docs.gradle.org/current/userguide/build_cache.html#sec:task_output_caching_details


结论

使用1.2.20版本及以上的kotlin-gradle-plugin编译Kotlin代码的话我们可以发挥Gradle的构建缓存的优势来加速项目的开发周期。关于扩展支持构建缓存任务的工作会持续进行。


继续前进!

以上是关于结合Kotlin使用Gradle build cache的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin基础从入门到进阶系列讲解(基础教程篇)详解build.gradle文件

Kotlin基础从入门到进阶系列讲解(基础教程篇)详解build.gradle文件

如何解析和修改build.gradle.kts Kotlin Gradle构建脚本?

Kotlin 编译“错误:Android Gradle 插件仅支持 Kotlin Gradle 插件版本 1.3.0 及更高版本。”但 build.gradle 中没有 kotlin_version?

如何在intelliJ IDEA中为我现有的Kotlin项目生成build.gradle文件

如何从非 build-gradle 文件访问 Kotlin DSL 扩展?