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学习笔记(三)从源码看构建流程之基本流程

一 gradle构建流程分为基本的三部:initlization,Configuration,Execution 1.初始化阶段 在这一阶段会解析加载init脚本和settings脚本,创建S...
  • yuanjw2014
  • yuanjw2014
  • 2016年11月16日 22:23
  • 237

大神所写的深度好文---Gradle 构建工具

我们大家都知道 Gradle 是一种构建工具,那么什么是构建工具呢?本文是关于Gradle的详解...
  • judy50
  • judy50
  • 2016年09月19日 17:07
  • 958

android gradle自动构建大总结

android gradle自动构建背景:日常出版本和线上出版本时,需要手动修改一些配置,包括key配置、线上/测试环境配置、版本号增加等,过程繁琐。所以对构建脚本进行改进,达到自动构建目的。...
  • duantihi
  • duantihi
  • 2017年02月16日 13:25
  • 1599

Gradle生命周期

Gradle生命周期Gradle构建系统有自己的生命周期,初始化、配置和运行三个阶段。1.初始化阶段,会去读取根工程中setting.gradle中的include信息,决定有哪几个工程加入构建, ...
  • u013626215
  • u013626215
  • 2016年05月24日 15:28
  • 2030

使用Gradle 快速构建项目

Installing Gradle Prerequisites Gradle requires a Java JDK or JRE to be installed, version...
  • boonya
  • boonya
  • 2016年01月21日 09:43
  • 1719

Gradle:构建脚本概要

一、构建块 1.每个构建块都包含三个基本构建块:project、task和property; 2.每个构建块包含至少一个project,进而又包含一个或多个task; 3.project和tas...
  • p106786860
  • p106786860
  • 2016年01月05日 23:56
  • 2263

(一)如何使用gradle构建Android项目

今天又是个放假的日子,放假对于很多人来说,可以到处去玩,可是对于那些单身程序猿来说,很难找到一个理由去哪里玩,...
  • u013970487
  • u013970487
  • 2014年03月22日 22:16
  • 2928

使用Gradle构建Java项目

译文出处: 字节技术   原文出处:spring.io 使用Gradle构建Java项目 这个手册将通过一个简单的Java项目向大家介绍如何使用Gradle构建Java项目。 我们将...
  • jueane
  • jueane
  • 2016年01月07日 15:57
  • 3285

灵活强大的构建系统Gradle

前言 构建,软件生命周期中重要的一环,在现代软件开发过程中,起着越来越重要的作用。过去在Java或类Java的世界里,Ant、Maven再熟悉不过了,Maven凭借其强大的依赖配置战胜Ant,基...
  • xu_song
  • xu_song
  • 2016年06月03日 13:51
  • 819

AndroidStudio开发必备常识之Gradle构建

Android Studio是Google开发的一款面向Android开发者的IDE, 支持Windows、Mac、Linux等操作系统,基于流行的Java语言集成开发环境IntelliJ搭建而成。但...
  • u010213440
  • u010213440
  • 2016年05月02日 00:18
  • 4475
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Gradle学习之增量式构建
举报原因:
原因补充:

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