前言
Gradle作为一款基于Groovy语言的构建工具,已经吸引众多的ant,maven使用者转投gradle的怀抱,和Gradle相比,ant显得冗余复杂,maven显得有些死板落后,而gradle基于DSL语法,特点明显:简洁、灵活、可读性强。
背景
♦ Maven 的软件代码由 Apache 基金会维护。而基础设施主要由 Sonatype、JFrog 两家企业维护,他们分别提供 Nexus 和 Artifactory 两大 artifact 管理体系,维护 Central 与 JCenter 两大公共仓库,并提供收费的企业服务(咨询、培训、认证、定制开发、云服务、高级管理工具)。
♦ Gradle 则是由 Gradle Inc. 维护,该企业也提供收费的 Gradle Enterprise 解决方案。
首先要说的是我们用的 Gradle 来作为我们的构建工具,所以主要是针对 Gradle 的命令来作了一些优化。
1、修改 gradle build 的参数
- 使用 --build-cache
什么是 build cache(构建缓存),在 Gradle 中,每一个待编译的工程叫 Project,每一个 Project 在构建时都包含一系列的 task。
每个 task 的输入都可以作为下一个 task 的输出,build cache 做的事就是把可以缓存(注:并不是所有的 task 输出都能缓存)的 task 输出都缓存住,这样在构建过程中,如果发现这个 task 的输入不变,就没必要重新执行任务了,直接从 task ouput 缓存里拿即可,如下图示,Build 2 的构建输入直接从 Build Cache 中拿,这样 Build 1 就不用构建了。
效果怎么样呢,看下图,下面图分别显示了 Gradle 持续集成时使用构建缓存和不使用构建缓存两种情况下的聚合的构建时间,可以看到使用了 cache 的 Gradle 构建速度明显快于不使用 cache 的情况。
更骚的是这个 Buiid Cache 支持分布式的,可以统一把这些 cache 丢到一台机器上,本地机器要编译时统一去这台机器拉 cache,这样如果我们切换分支时执行构建也能用 Build Cache 来加快构建速度。
--build-cache 的具有使用需要注意一些事项,比如得 Gradle 4.3 以上才有效,建议大家直接去官网查查看。
- 增加 --parallel 参数
并行执行在多项目编译的项目中能有效提升编译的速度,但是并行执行的前提是每个项目已经被模块化,每个项目之间没有耦合。
- 移除 --refresh-dependencies 参数
原来 gradle build 有加这个参数,这个参数会忽略缓存,强制重新下载,显然是编译的瓶颈。
2、任务并行
原来 Jenkins 中执行 Gradle 编译任务,每个 Task 是串行执行的,总编译耗时是每个任务执行时间的总和。
现在把它改成了并行的
显然并行执行会快得多。
3、将大项目工程中的常用代码抽成 jar 包
对于业务方来说,采用这种方式也是提升编译速度的有效手段 ,将大量代码抽成 jar 包,意味着它们本身就是字节码了,在 gradle build 时就不用编译啦。自然能提升整个工程的编译打包时间。
总结
如果你 Gradle 用得越多,越能体会到这种理念上的差异。
- Maven 作为一个依赖管理工具而诞生,对于它上层的商业形态而言,这个工具只是基础之一,这不影响它的工具属性;
- Gradle 作为一个构建工具而诞生,它的商业形态围绕着这个核心而展开,这影响它的工具属性。