Gradle增量学习建筑
请在本系列下面的文章下载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-DATEBUILD SUCCESSFULTotal time: 2.104 secs
我们发现,combineFileContentIncremental被标记为UP-TO-DATE,表示该Task是最新的。Gradle将不予运行。
在实际应用中,你将遇到非常多这种情况。由于Gradle的非常多插件都引入了增量式构建机制。
假设我们改动了inputs(即sourceDir目录)中的不论什么一个文件或删除掉了destination.txt。当调用“gradle combineFileContentIncremental”时。Gradle又会又一次运行。由于此时的Task已经不再是最新的了。
对于outputs,我们还能够使用upToDateWhen()方法来决定一个Task的outputs是否为最新,这个方法接受一个闭包作为检查条件,有兴趣的读者可以自行了解。
版权声明:本文博客原创文章。博客,未经同意,不得转载。
Gradle增量学习建筑的更多相关文章
- Gradle更小、更快构建APP的奇淫技巧
本文已获得原作者授权同意,翻译以及转载原文链接:Build your Android app Faster and Smaller than ever作者:Jirawatee译文链接:Gradle更小 ...
- 《gradle 用户指南中文版》目录
gradle 用户指南 版权所有©2007-2017 Hans Dockter,Adam Murdoch只要您不对这些副本收取任何费用,并且进一步规定,每个副本都包含本版权声明,无论是以印刷版还是电子 ...
- Gradle配置APK自动签名完整流程
转载请注明出处:http://www.cnblogs.com/LT5505/p/6256683.html 一.生成签名 1.命令行生成签名,输入命令keytool -genkey -v -keysto ...
- gradle学习笔记(1)
1. 安装 (1) 下载最新gradle压缩包,解压到某处.地址是:Gradle web site: (2) 添加环境变量: 1) 变量名:GRADLE_HOM ...
- Gradle 实现 Android 多渠道定制化打包
Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...
- 解决 Could not find com.android.tools.build:gradle 问题
今天拉同事最新的代码,编译时老是报如下错误: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the fol ...
- React Native Android gradle下载慢问题解决
很多人会遇到 初次运行 react-native run android的时候 gradle下载极慢,甚至会失败的问题 如下图 实际上这个问题好解决的 首先 把对应版本的gradle下载到本地任意一个 ...
- Android studio使用gradle动态构建APP(不同的包,不同的icon、label)
最近有个需求,需要做两个功能相似的APP,大部分代码是一样的,只是界面不一样,以前要维护两套代码,比较麻烦,最近在网上找资料,发现可以用gradle使用同一套代码构建两个APP.下面介绍使用方法: 首 ...
- 对Maven、gradle、svn、spring 3.0 fragment、git的想法
1.Maven Maven可以构建项目,采用pom方式配置主项目和其他需要引用的项目.同时可结合spring3.0的新特性web fragment. 从现实出发,特别是对于管理不到位,程序员整体素质 ...
随机推荐
- Android开发ListView使用OnScrollListener实现分页加载数据
上篇博文和大家分享了下拉刷新,这是一个用户体验很好的操作方式.新浪微薄就是使用这样的方式的典型. 还有个问题,当用户从网络上读取微薄的时候.假设一下子所有载入用户未读的微薄这将耗费比較长的时间,造成不 ...
- Cocos2d-x 3.2 Lua演示样例 ClickAndMoveTest(点击移动測试)
Cocos2d-x 3.2 Lua演示样例 ClickAndMoveTest(点击移动測试) 本篇博客介绍Cocos2d-x 3.2Lua演示样例中点击移动的样例,在这个样例你能够得到怎样创建单点触 ...
- BDB (Berkeley DB)简要数据库(转载)
使用最近DBD.然后搜了下相关资料,首先公布的是一门科学: 转会http://www.javaeye.com/topic/202990 DB综述DB最初开发的目的是以新的HASH訪问算法来取代旧的hs ...
- C++ Primer 学习笔记_45_STL实践与分析(19)--建筑常规算法
STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...
- Apache+Tomcat部署负载均衡(或集群)
本来只打算写Tomcat集群部署,简化Apache和Tomcat整合过程的.后来想了想,这样不便于没有用过Apache的朋友来学习本文内容.于是干脆加大篇幅,让对Apache不了解的朋友能对Apach ...
- 在Windows基础上(硬盘)安装Linux操作系统(CentOS/RedHat)
注:该方法安装CentOS ,RedHat均没有问题,其它Linux操作系统,没有尝试过. 0.创建一个fat32的盘.我分了8G给这个盘,盘符为F.F盘以后的内存所有删除,作为未分配的内存.这个留用 ...
- lunux命令笔记
文件查看命令 ls / -lh ls list / 路径 -l 具体 -lh 具体的人性化显示 -ld 显示文件夹 -i 显示i节点 mkdir /tmp/mulu/mulu2 /tmp/ma/mb ...
- Libgdx Box2D现实------这缓释微丸(一个:项目介绍)
它花了两个星期的假写物理游戏,在几次课逃逸,是大学,因为大部分时间点!今天,我基本上一直每节课的点1-3有时它,哎,这似乎是不再逃跑.不知道值没有值得,仅仅是简单地想做自己喜欢的事情,而不是跟老师大眼 ...
- HDU 1061 Rightmost Digit解决问题的方法
求大量N^N的值最右边的数字,即最低位. 它将能够解决一个简单二分法. 只是要注意溢出,只要把N % 10之后.我不会溢出,代替使用的long long. #include <stdio.h&g ...
- 的无线通信网络的学习LTE的关键技术HARQ(20141217)
今天,我们就来一起看一下LTE申请的关键技术HARQ(自己主动混合重传技术) 因为在信道传输过程中的信息,它会产生信息丢失,因此,为了维持的信息的完整性.总是有重发信息,完成所有的迄今收到的资料. 首 ...