Gradle学习之增量式构建

原创 2014年11月17日 15:46:49
请通过以下方式下载本系列文章的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文件操作基础

一、定位文件: 我们可以使用Project.file()方法来定位一个文件获取File对象(详情参考Project的API),如下: //相对路径 File configFile = file('...
  • dfsigue
  • dfsigue
  • 2016-12-06 10:24:04
  • 3587

Gradle学习(十五)——增量构建

Up-to-date检查(AKA增量构建)任何构建工具最重要的一个功能就是防止做重复工作。例如对于编译进程来说,如果已经执行了一次编译,那么就不需要再进行第二次,除非发生了一些会影响输出的操作,比如源...
  • lastsweetop
  • lastsweetop
  • 2018-01-10 16:35:36
  • 3884

Gradle笔记——Gradle的简介与安装

这一篇博客,主要是面向对Gradle有所耳闻,但却没有一个比较清晰的概念的。在这篇博客里,将对Gradle进行一个简单的介绍,以及它的安装。 Gradle介绍 Gradle是一个基于JVM的构建工...
  • maosidiaoxian
  • maosidiaoxian
  • 2014-10-15 13:22:40
  • 238980

Gradle 动态编译-利用配置文件指定不同软件版本对应的服务器地址

1.需求:1.能够在配置文件中指定不同软件版本对应的服务器地址,免除开发人员多次修改服务器地址的工作,避免错误。 2.同时生成不同版本的apk,避免重复无意义的工作。 2.改进:思路: 引入 Jenk...
  • luoyan973387349
  • luoyan973387349
  • 2016-09-06 14:24:53
  • 1731

增量更新操作详解

增量更新操作详解 ONE Goal , ONE Passion ! 简介:studio中操作步骤:第一步:定义native方法 直接copy两个工具类到项目中,如图1 Di...
  • fengltxx
  • fengltxx
  • 2017-02-13 18:14:29
  • 1053

增量更新

原文地址:/dd864140130/article/details/52928419 在前几年,整体移动网络环境相比现在差很多,加之流量费用又相对...
  • A1345g2354
  • A1345g2354
  • 2016-10-28 11:44:25
  • 464

钱柜娱乐开户 增量更新(一)

NDK 增量更新
  • qq_32368129
  • qq_32368129
  • 2016-11-04 13:52:35
  • 209

Gradle实现的两种简单的多渠道打包方法

本来计划今天发钱柜娱乐开户的官方技术文档的翻译——《Gradle插件用户指南》的第五章的,不过由于昨天晚上没译完,还差几段落,所以只好推后了。 今天就说一下使用Gradle进行类似友盟这样的多渠道打...
  • maosidiaoxian
  • maosidiaoxian
  • 2014-12-18 09:07:46
  • 55739

增量更新——新兴的一种更新方式

随着钱柜娱乐开户应用体积的不断增大,以及应用版本发布的不断更迭,用户的升级成了一个问题,google也意识到不断更新应用对用户流量的损耗,在Google I/O 上提及的 Smart App upd...
  • LuckChouDog
  • LuckChouDog
  • 2016-04-30 17:52:30
  • 2608
收藏助手
不良信息举报
您举报文章:Gradle学习之增量式构建
举报原因:
原因补充:

(最多只允许输入30个字)