请通过以下方式下载本系列文章的Github示例代码:
git clone https://github.com/davenkin/gradle-learning.git
如果我们将Gradle的Task看作一个黑盒子,那么我们便可以抽象出输入和输出的概念,一个Task对输入进行操作,然后产生输出。比如,在使用java插件编译源代码时,输入即为Java源文件,输出则为class文件。如果多次执行一个Task时的输入和输出是一样的,那么我们便可以认为这样的Task是没有必要重复执行的。此时,反复执行相同的Task是冗余的,并且是耗时的。
为了解决这样的问题,Gradle引入了增量式构建的概念。在增量式构建中,我们为每个Task定义输入(inputs)和输入(outputs),如果在执行一个Task时,如果它的输入和输出与前一次执行时没有发生变化,那么Gradle便会认为该Task是最新的(UP-TO-DATE),因此Gradle将不予执行。一个Task的inputs和outputs可以是一个或多个文件,可以是文件夹,还可以是Project的某个Property,甚至可以是某个闭包所定义的条件。
每个Task都拥有inputs和outputs属性,他们的类型分别为TaskInputs和TaskOutputs。在下面的例子中,我们展示了这么一种场景:名为combineFileContent的Task从sourceDir目录中读取所有的文件,然后将每个文件的内容合并到destination.txt文件中。让我们先来看看没有定义Task输入和输出的情况:
task combineFileContentNonIncremental { def sources = fileTree('sourceDir') def destination = file('destination.txt') doLast { destination.withPrintWriter { writer -> sources.each {source -> writer.println source.text } } } }
多次执行“gradle combineFileContentNonIncremental”时,整个Task都会反复执行,即便在第一次执行后我们已经得到了所需的结果。如果该combineFileContentNonIncremental是一个繁重的Task,那么多次重复执行势必造成没必要的时间耗费。
这时,我们可以将sources声明为该Task的inputs,而将destination声明为outputs,重新创建一个Task如下:
task combineFileContentIncremental { def sources = fileTree('sourceDir') def destination = file('destination.txt') inputs.dir sources outputs.file destination doLast { destination.withPrintWriter { writer -> sources.each {source -> writer.println source.text } } } }
相比之下,后一个Task只比前一个Task多了两行代码:
inputs.dir sources
outputs.file destination
当首次执行combineFileContentIncremental时,Gradle会完整地执行该Task。但是紧接着再执行一次,命令行显示:
:combineFileContentIncremental UP-TO-DATE
BUILD SUCCESSFUL
Total time: 2.104 secs
我们发现,combineFileContentIncremental被标记为UP-TO-DATE,表示该Task是最新的,Gradle将不予执行。在实际应用中,你将遇到很多这样的情况,因为Gradle的很多插件都引入了增量式构建机制。
如果我们修改了inputs(即sourceDir文件夹)中的任何一个文件或删除掉了destination.txt,当调用“gradle combineFileContentIncremental”时,Gradle又会重新执行,因为此时的Task已经不再是最新的了。对于outputs,我们还可以使用upToDateWhen()方法来决定一个Task的outputs是否为最新的,该方法接受一个闭包作为检查条件,感兴趣的读者可以自行了解。
相关推荐
cordova生成android的settings.gradle配置module(csdn)————程序
手把手带你自定义 Gradle 插件 —— Gradle 系列(2).doc
使用Gradle 构建spring Boot工程系列
springboot+gradle项目基于idea的构建,易于理解。简单的搭建
现代软件开发的格局发生了变化,构建自动化成为大势所趋。本文介绍一个Java项目构建的新型利器——Gradle。
Gradle构建(war) web项目示例 Gradle在已有的web工程中使用gradle打war包
Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。文档详细说明的...
IDEA中Gradle学习指南
需要深入浅出的学习Android studio中的Gradle朋友可前来下载观看。 这个里面是百度云盘的资源链接。
gs-gradle, 使用Gradle构建Java项目 标记项目gradle目录你将构建什么。你需要什么。设置了项目项目。安装 Gradle找出Gradle可以做什么。构建Java代码声明依赖项使用Gradle包装程序生成项目。摘要文件另请参
jar共享gradle-aspectj-1.6,maven构建gradle的jar,maven构建gradle的jar,maven构建gradle的jar。
为什么说 Gradle 是 Android 进阶绕不去的坎 —— Gradle 系列(1).doc
基于springmvc+spring+hibernate+gradle构建,前后交互采用ajax
等一分钟——Android项目构建性能优化抛砖引玉的副本
gradle是一个构建工具,专注于构建自动化和支持多语言开发。如果您正在任何平台上构建、测试、发布和部署软件,Gradle提供了一个灵活的模型,该模型可以支持从编译和打包代码到发布Web站点的整个开发生命周期。...
网络红文 实战gradle,android,java开发人员的必修课
共有gradle 6.1.1,6.5.1,6.6.1,6.7四个版本
gradle学习资料2
gradle学习资料3
1.1 什么是Gradle? Gradle是一个开源构建自动化工具,专为大型项目设计。它基于DSL(领域特定语言)编写,该语言是用Groovy编写的,使得构建脚本更加...性能:Gradle使用它的守护程序和增量构建技术来提高构建速度。