Gradle缓存机制

了解Gradle本身的缓存机制,更好的使用它。

题图:from Google

Gradle是什么

Gradle跟ant/maven一样,是一种依赖管理/自动化构建工具。但是跟ant/maven不一样是,它并没有使用xml语言,而是采用了Groovy语言,这使得它更加简洁、灵活,更加强大的是,gradle完全兼容maven。

Gradle官网用户指南:Gradle UserGuide

Gradle的缓存机制

注:以下示例中假设已有一个Gradle的task,名为warProduct。

1.脚本缓存

为了提高响应速度,默认情况下Gradle会缓存所有已编译的脚本。包括所有构建脚本、初始化脚本和其他脚本。

以构建脚本为例,在第一次运行构建脚本时, Gradle 会创建.gradle目录,用于存放已编译的脚本。在下次运行构建脚本时, 如果该脚本自它编译后没有被修改,Gradle 会使用这个已编译的脚本。否则该脚本会重新编译,并把最新版本存在缓存中。

在实际使用中,如果不想使用这种缓存机制,可以通过–recompile-scripts选项运行 Gradle ,这样会丢弃缓存的脚本,然后重新编译脚本并将其存在缓存中。我们可以用这种方式强制重新编译脚本。

示例
gradle warProduct –recompile-scripts

参考链接:
Gradle命令行选项:gradle command line

2.task缓存

同样是为了提高速度,Gradle对于内建类型task,也即built-in tasks,也使用了缓存。(自定义task只要指定了输入输出路径,也会使用缓存)

使用缓存的效果如下所示:

第一次执行task

第二次执行task

每当一个built-in task第一次执行之前,Gradle会对task的输入做一次快照,然后执行这个task,在其成功执行后,Gradle会对task的输出做一次快照。Gradle会缓存这俩快照直到该task下次执行。

在该task下次执行之前,Gradle会对其输入在此进行快照,然后与缓存中的快照对比,如果相同,Gradle则认为该task是up-to-date的,然后跳过执行,直接输出缓存中的快照,如果不同,Gradle会执行该task并再次进行快照更新缓存。

在实际使用中,如果不想使用这种缓存机制,可以调用TaskOutputs.upToDateWhen()方法。只有满足此方法提供的条件,Gradle才会认为task是up-to-date的。因此我们只需要将条件设为false即可。

示例
warProduct.getOutputs().upToDateWhen( {return false} )

参考链接:
Gradle文档:Skipping tasks that are up-to-date