结合Kotlin使用Gradle build cache

宛丘之上兮 关注

2018.03.11 00:21* 字数 1177 阅读 505评论 5喜欢 4

在2017年4月,Gradle发布了build cache的beta版本。构建缓存与不断增长的构建特性相互补充。Gradle 4.0版本中,构建缓存已经准备好

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 2s
21 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构建缓存的知识:

结论

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

继续前进!


翻译自原文: Using Gradle build cache with Kotlin,感觉翻译的很不好,请批评指正

构建缓存gradle的更多相关文章

  1. 构建工具Gradle

    1.Summary   从Android团队开始宣布放弃Eclipse转投Android Studio时,构建工具Gradle进入了Android开发者的视野.而随着热修复.插件化.编译时注解的流行, ...

  2. 开发效率优化之自动化构建系统Gradle(二)下篇

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从自定义 Gradle 插件开发来介绍自动化构建系统 ...

  3. 开发效率优化之自动化构建系统Gradle(二)上篇

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将以下两个内容来介绍自动化构建系统Gradle: gra ...

  4. 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!

    写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...

  5. Android项目中如何用好构建神器Gradle?(转)

    最近在忙团队并行开发的事情,主要是将各个团队的代码分库,一方面可以降低耦合,为后面模块插件化做铺垫,另一方面采用二进制编译,可以加快编译速度.分库遇到了一些问题,很多都要通过Gradle脚本解决,所以 ...

  6. 构建自己的PHP框架--构建缓存组件(1)

    作为一个框架,我们还没有相应的缓存组件,下面我们就来构建我们的缓存组件. 先来定义一下接口,在 src 文件夹下创建 cache 文件夹,在cache文件夹下创建 CacheInterface.php ...

  7. nginx中使用srcache_nginx模块构建缓存

    nginx中可以将lua嵌,让nginx执行lua脚本,可以处理高并发,非阻塞的处理各种请求,openresty项目中可以使用nignx可以直接构建 srcache_nginx + redis 缓存, ...

  8. 项目构建工具Gradle的使用入门(参考,只表明地址)

    Gradle入门介绍:简介 http://blog.jobbole.com/71999/ Gradle入门介绍:第一个Java项目 http://blog.jobbole.com/72558/ Gra ...

  9. 构建工具Gradle安装和简单使用

    1. 安装 到gradle官网下载页 https://gradle.org/gradle-download/ 下载gradle,其中“完全版(Complete distribution)”包含除了运行 ...

随机推荐

  1. sql中的in与not in,exists与not exists的区别

    1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的.如果查询的两个表 ...

  2. day1作业(格式化输出)

    练习:用户输入姓名.年龄.工作.爱好 ,然后打印成以下格式------------ info of Egon -----------Name  : EgonAge   : 22Sex   : male ...

  3. 关于lampp中的proftpd的一些使用

    这个是配置文件 ServerName "ProFTPD" ServerType standalone DefaultServer on Port 21 这个是端口 Umask Ma ...

  4. java中的排序(自定义数据排序)--使用Collections的sort方法

    排序:将一组数据按相应的规则 排列 顺序 1.规则:       基本数据类型:日常的大小排序. 引用类型: 内置引用类型(String,Integer..),内部已经指定规则,直接使用即可.---- ...

  5. nslookup和dig命令

    nslookup与dig两个工具功能类似,都可以查询制定域名所对应的ip地址,所不同的是dig工具可以从该域名的官方dns服务器上查询到精确的权威解答,而nslookup只会得到DNS解析服务器保存在 ...

  6. xsync

    shell  小工具,用于集群搭建: xsync脚本基于rsync工具,rsync 远程同步工具,主要用于备份和镜像.具有速度快.避免复制相同内容和支持符号链接的优点,它只是拷贝文件不同的部分,因而减 ...

  7. git 简单的操作命令

    1, 克隆已存在项目 => git clone url 2, 拉取代码 => git pull 3,  配置账号密码 git config --global user.email &quo ...

  8. 白鹭引擎 - 矢量绘图 ( graphics )

    class Main extends egret.DisplayObjectContainer { /** * Main 类构造器, 初始化的时候自动执行, ( 子类的构造函数必须调用父类的构造函数 ...

  9. 【ASP.NET 进阶】仿百度文库文档在线预览(支持格式.pdf,.doc,docx,xls,xlsx,.ppt,pptx)

    在[ASP.NET]PDF文件在线预览(类似百度文库)基础上进行了office文件到pdf文件的转换,然后在显示出来,效果如下: 问题说明: 1.请通过以下方式添加 Office COM 组件. 2. ...

  10. 排查bug的步骤

    原创文章,欢迎阅读,禁止转载. bug预防C/C++代码发布前的检查:检查有没有低级错误,可用cppcheck (bug预防是指在写程序的时候,bug没出现,积极的进行预防,减少.包括良好的编码风格. ...