QCon 广州站2022已开启,三大关键词:数字化、国产化、云原生。戳此了解 了解详情
写点什么

在 Kotlin 中使用 Gradle 构建缓存

  • 2018 年 3 月 11 日
  • 本文字数:1971 字

    阅读完需:约 6 分钟

Kotlin 1.2.21 允许 Kotlin 项目使用构建缓存。通过 Gradle 的构建缓存功能,可以提升 Kotlin 代码的编译速度,加快开发周期。本文将结合实际例子,介绍利用 Gradle 加速 Kotlin 代码编译的原理、配置示例以及在 IDE 中的使用方法。

构建缓存允许Gradle 可以复用**任何之前调用(包括那些来自其它机器的调用) ** 的任务产出。 Kotlin 1.2.21 允许 Kotlin 项目使用构建缓存。

构建缓存的工作原理是在缓存中存储编译过的类、测试结果和其它构建工序,同时记录所有的任务输入,包括输入文件内容、相关的类路径和任务配置。

这常常导致**更快的构建 **。下面的图标展示了在 Gradle 的持续集成中使用构建缓存和不使用构建缓存所收集到的构建时间:

本文中,我们将向你阐述,如何使用Gradle 的构建缓存来避免不必要的Kotlin 编译,从而加快你的构建过程。

Spek 快速示例

你现在就可以尝试使用 Gradle 的构建缓存。只需要遵循下面几个步骤:

Clone 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 包和复制文件的速度比从缓存中拉取缓存结果的速度更快。另外Gradle 构建缓存也支持缓存:test任务。

当持续集成的一个实例填充了一个共享的构建缓存(开发者可以从中拉取)时,Gradle 构建缓存会特别有效。下文罗列了实现这点的更多资源的链接

为你的项目启用构建缓存

我希望你会在自己的项目上尝试使用构建缓存——你可以遵循下面的步骤来启用构建缓存。

首先,你需要确保正在使用Gradle 4.3 或者更高版本,这样才能选择Kotlin Gradle Plugin 来使用新的Gradle APIs。你可以方便地使用 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来为当前构建启用构建缓存。
  • $PROJECT_ROOT/gradle.properties中增加org.gradle.caching=true来为整个项目启用构建缓存。
  • $GRADLE_HOME/gradle.properties中增加org.gradle.caching=true来为当前用户的所有构建启用构建缓存。

注意: Android 开发者即使设置了android.enableBuildCache=true,也仍需要按照上述方法启用构建缓存,因为 Gradle 的构建缓存是独立于 Android 的构建缓存的。

我们可以选择通过将 run 和 test actions 委派给 Gradle 的方式,来利用 IDE 的构建缓存。

在 IntelliJ 中启用构建缓存

如果你使用 IntelliJ 来执行 Gradle actions,你需要在 IDE 配置中勾选“Delegate IDE build/run actions to Gradle(将 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功能来加快开发周期。我们正在继续努力来扩展支持构建缓存的任务集。

关于作者

Eric Wendelin是 Gradle 的软件工程师,旨在让软件构建更简单。

查看英文原文: Using Gradle build cache with Kotlin

感谢覃云对本文的审校。

2018 年 3 月 11 日 17:232400

评论

发布
暂无评论
发现更多内容

火爆!GitHub 标星 144k 的前后端学习路线

沉默王二

学习 后端

mysql 四种隔离级别

Sakura

28天写作 3月日更

带你全面认识CMMI V2.0(一)

渠成CMMI

项目管理 CMMI

助我拿到37KOffer,这份阿里巴巴890页Redis笔记可谓功不可没

Java架构追梦

Java redis 阿里巴巴 架构 面试

轻量级的接口自动化冒烟框架

小小娃爱吃甜食

自动化 测试 框架 自动化部署

HashData外部表的实现与应用

HashData

快了何止300%?阿里巴巴Java优化:设计+程序+并行+JVM+工具

Java架构追梦

Java 阿里巴巴 架构 面试 性能优化

我用一个小小的开放设计题,干掉了40%的面试候选人

架构精进之路

Web 安全 软件设计 3月日更

HashData多集群共享统一存储架构

HashData

Superset 兼容ADB(AnalyticDB-MySQL)

data_y

Python MySQL Apache Superset

全国大学生智能汽车竞赛-百度线下赛题发布!封狼居胥,等你来战!

百度大脑

人工智能 百度 比赛 飞桨 AI Studio

万字长文,肝了一下午的线程池详解!

JavaFish

Java 多线程 线程池 线程池工作原理

一文搞懂步进电机特性、原理及驱动器设计

不脱发的程序猿

硬件产品 28天写作 3月日更 步进电机 驱动电机

百度×TCL丨鸿鹄语音芯片首次在家电行业量产!

百度大脑

百度 语音识别 百度大脑 智能家居 百度智能云

阿里P8亲自教你!2021Android大厂面试知识分享,实战篇

欢喜学安卓

android 程序员 面试 移动开发

阿里P8手把手教你!万字Android技术类校招面试题汇总,附赠课程+题库

欢喜学安卓

android 程序员 面试 移动开发

《精通比特币》学习笔记(第七章)

棉花糖

区块链 学习 3月日更

中国石油数字化转型提速 HashData助力梦想云建设

HashData

Python 中级知识之装饰器,滚雪球学 Python

梦想橡皮擦

28天写作 3月日更

首款微控制器级树莓派 Pico,超廉价只需4美元

不脱发的程序猿

树莓派 28天写作 3月日更 树莓派 Pico 微处理器

JVM笔记 -- JVM经历了什么?

秦怀杂货店

Java JVM

江苏交通控股打造IT架构云转型下的智慧交通

HashData

ZooKeeper 的选举机制,你了解多少?

架构 分布式

【LeetCode】 基本计算器 II Java题解

HQ数字卡

算法 LeetCode 28天写作 3月日更

Weblogic11g安装部署-winserver篇

xiezhr

中间件 Windows Server 3月日更 weblogic

HashData与HDFS的高效数据交换

HashData

2021年4款好用的音乐编曲软件推荐

奈奈的杂社

有源晶振和无源晶振的区别

不脱发的程序猿

28天写作 电路设计 3月日更 晶振 元器件

什么是VXLAN?为什么需要VXLAN?

华为云开发者社区

网络 虚拟化 VLAN VXLAN 报文

百度文心多项任务分数刷新GLUE榜单,NLP界的“MVP”再次夺冠

百度大脑

自然语言处理 百度 文心 ERNIE

1500道算法面试题:Github上标星86.7K!直接火遍全网

比伯

Java 编程 程序员 架构 面试

在Kotlin中使用Gradle构建缓存_语言 & 开发_Eric Wendelin_InfoQ精选文章