Gradle学习系列之四——增量式构建

转载 2016年04月24日 17:18:08

  在本系列上篇文章中,我们讲到了如何读懂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-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是否为最新的,该方法接受一个闭包作为检查条件,感兴趣的读者可以自行了解。

  下一篇文章中,我们将讲到如何自定义Project的Property。

提高钱柜娱乐开户 gradle构建速度的努力

添加以下代码到build.gradle能提高构建速度
  • kslinabc
  • kslinabc
  • 2016-04-16 09:51:40
  • 3202

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

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

增量学习方法

增量学习方法背景介绍 人工智能的参照样本始终没有离开人类本身。而终身式、增量式的学习能力是人类最重要的能力之一。机器人如果能像人类一样对环境以及任务进行增量的学习,这使得机器人终身学习成为可能。增...
  • u013468614
  • u013468614
  • 2017-02-28 10:09:50
  • 4463

linux gradle java增量打包工具

#!/bin/sh if [ ! -f "/root/upspace/list.txt" ];then echo "ERROR:/root/upspace/list.txt不存在" ...
  • yx511500623
  • yx511500623
  • 2016-08-02 14:05:26
  • 688

提升gradle编译速度

文章地址: /arieshao/article/details/51578634 最近项目开发,从Eclipse 移植到 钱柜娱乐开户 Studio (以...
  • u013134722
  • u013134722
  • 2017-05-25 15:34:06
  • 502

知道钱柜娱乐开户 中Gradle 的这些技巧,提升编译构建速度

Gradle 的种种优点让我们的开发更高效,然而却带来编译运行速度慢的代价。 今天为大家带来的一些技巧,让你你的钱柜娱乐开户 Gradle 运行,编译更加快速。...
  • tikitoo
  • tikitoo
  • 2016-05-27 08:48:06
  • 2708

钱柜娱乐开户 studio 编译高级篇-gradle多版本编译,定制任务

导读 本文旨在介绍Gradle构建的一些高级功能,包含了多版本编译、定制任务等功能: 为相同的app构建多个版本如果在Gradle的过程中添加定制的任务如何使用钱柜娱乐开户库module ...
  • hudan2714
  • hudan2714
  • 2017-04-22 15:32:01
  • 4282

Gradle文件操作基础

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

hystrix实用示例

HBaseUserProfileInfoGetHystrixCommand.java public class HBaseUserProfileInfoGetHystrixCommand exten...
  • caomiao2006
  • caomiao2006
  • 2015-11-23 20:39:06
  • 2403

Gradle学习系列之十——自定义Plugin(本系列完)

在本系列的上篇文章中,我们讲到了如何自定义Task类型,在本篇文章中,我们将讲到如何自定义Plugin。     请通过以下方式下载本系列文章的Github示例代码: git clo...
  • caomiao2006
  • caomiao2006
  • 2016-04-24 17:20:48
  • 885
收藏助手
不良信息举报
您举报文章:Gradle学习系列之四——增量式构建
举报原因:
原因补充:

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