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. 从现实出发,特别是对于管理不到位,程序员整体素质 ...
随机推荐
- PB数据库相关
---------------------------------------------------------------- 数据库画板: 一张表定义了主键或者唯一索引,则能够在Results视窗 ...
- hdu1507最大匹配
题意:给出n*m的矩阵方块,某些方块是ponds,这些方块不能出售,然后能出售的是1*2的方块 要求求出有多少块1*2的方块能够出售,并输出这些方块的坐标(specia judge) 关键是怎么建出二 ...
- w7关闭休眠增加C盘容量
http://jingyan.baidu.com/article/f3ad7d0fc0992e09c2345b51.html powercfg -h off,即可关闭休眠功能 powercfg -h ...
- 升级 树莓派的gcc/g++编译器到4.8
首先,更新你的树莓派(避免编译出来版本不对导致不能insert)sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade s ...
- 2015广东工业大学ACM学校巡回赛 I 游戏高手 (如压力dp)
Problem I: 游戏王 Description 小学的时候,Stubird很喜欢玩游戏王.有一天,他发现了一个绝佳的连锁组合,这个连锁组合须要6张卡. 但是他一张都没有,但是他的那些朋友们有.只 ...
- iOS_24_画画板(含取色板)
终于效果例如以下: 一.简单说明 1.使用一个数组 strokesArr(笔画数组)记录全部笔画.数组中保存的是一个个的笔画字典,一个字典就是一个笔画.笔画字典中有三项:笔画的大小.颜色.points ...
- 【原版的】PHP技术成长规划过程中猿人
PHP程序猿的技术成长规划 作者:黑夜路人(2014/10/15) 依照了解的非常多PHP/LNMP程序猿的发展轨迹.结合个人经验体会,抽象出非常多程序猿对未来的迷漫,特别对技术学习的盲目和慌乱.简单 ...
- POJ 3356 AGTC(最长公共子)
AGTC Description Let x and y be two strings over some finite alphabet A. We would like to transform ...
- 【PLSQL】变量声明,结构语句,cursor游标
************************************************************************ ****原文:blog.csdn.net/clar ...
- iOS6之后 NSAttributedString 福利
@于iOS6之前,需要使用NSMutableAttributedString当你需要导入:CoreText.framework框架的.但在iOS6 之后就不在须要了. - (void)testOfNS ...