`
wbj0110
  • 浏览: 1602826 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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是否为最新的,该方法接受一个闭包作为检查条件,感兴趣的读者可以自行了解。

分享到:
评论

相关推荐

    Java项目构建新型利器——Gradle

    随着现代软件开发的复杂性不断增加,构建自动化成为了一种必要,Java项目构建的新型利器——Gradle应运而生。Gradle是基于Java的下一代构建工具,它的出现改变了构建工具的格局,提供了更强的表现力和更好的可维护性...

    cordova生成android的settings.gradle配置module(csdn)————程序.pdf

    ### Cordova生成Android的settings.gradle配置Module解析 #### 一、引言 在跨平台开发领域,Cordova作为一款开源框架,允许开发者使用HTML、CSS和JavaScript等Web技术来构建移动应用。对于Android平台,Cordova会...

    gradle深入学习的视频

    除了视频教程之外,阅读官方文档也是深入学习Gradle的重要途径之一。官方文档提供了详尽的信息,包括API参考、用户指南和示例代码,可以帮助你更全面地了解Gradle的功能和用法。 #### 实践项目经验 理论学习固然...

    使用Gradle 构建spring Boot工程系列项目源码(配合第五篇文章)

    本资源包"使用Gradle构建Spring Boot工程系列项目源码"是针对一系列教程的配套源代码,旨在帮助开发者深入理解如何利用Gradle有效地构建Spring Boot应用程序。通过分析这些源码,我们可以学习到以下关键知识点: 1....

    手把手带你自定义 Gradle 插件 —— Gradle 系列(2).doc

    【Gradle 插件开发详解】 在Gradle构建系统中,插件扮演着至关重要的角色,它们提供了构建过程中的特定功能,如Java编译、Android...通过学习和实践自定义插件,开发者可以更好地适应项目的特殊需求,提升构建效率。

    groovy 学习gradle学习经典手册

    《Groovy学习与Gradle实践经典手册》是一本深度探讨Groovy编程语言和Gradle构建工具的指南,专为Android及Java开发人员提供全面的知识覆盖。本书旨在帮助开发者提升在项目管理和自动化构建方面的技能,使其能够高效...

    gradle学习资料3

    《Gradle学习资料3》是针对Gradle这一高级构建工具的深入学习材料,适用于开发者、运维人员以及对自动化构建有兴趣的学习者。Gradle以其强大的灵活性、高性能和丰富的插件生态系统,已经成为Java和Android开发领域中...

    gradle-8.7-bin

    1、gradle8.7 2、gradle-8.7-bin 3、gradle--8.7 4、什么是Gradle? Gradle是一个开源构建自动化工具,专为大型项目设计。它基于DSL(领域特定语言)...性能:Gradle使用它的守护程序和增量构建技术来提高构建速度。

    gradle构建工具下载

    Gradle是一款强大的构建自动化工具,尤其在Java和Android开发领域广泛应用。它采用了Groovy和Kotlin等动态语言,使得构建脚本更为灵活和简洁。在本文中,我们将深入探讨Gradle构建工具及其不同版本的特点,以及如何...

    gradle 构建仓库3

    在"gradle DB3.zip 共5个压缩包"中,可能包含了一系列的Gradle项目实例,每个压缩包代表一个独立的项目或者构建阶段。这些项目可能涵盖了不同场景,如基础的Java应用构建、Android应用构建、多模块项目构建或者...

    gradle学习总结

    4. **增量构建**:Gradle能够智能识别变化,仅重新执行必要的任务,进一步提升构建效率。 5. **插件生态系统**:Gradle拥有丰富的插件库,覆盖了各种框架和工具,如Android、Java、Scala等。 **三、Gradle 使用...

    gradle学习资料2

    "gradle学习资料2"这个压缩包可能包含一系列的学习资源,如文档、示例代码和教程,帮助用户深入理解Gradle的用法和特性。 1. **Gradle基本概念**: - **构建脚本**:Gradle使用Groovy或Kotlin DSL编写构建脚本,...

    Gradle-8.7-all最新版安装压缩包

    1.1 什么是Gradle? Gradle是一个开源构建自动化工具,专为大型项目设计。它基于DSL(领域特定语言)编写,该语言是用Groovy编写的,使得构建脚本更加...性能:Gradle使用它的守护程序和增量构建技术来提高构建速度。

    Gradle构建(war) web项目示例

    在现代的Java Web开发中,Gradle已经成为一个流行的构建工具,它替代了传统的Maven或Ant,提供了更灵活、可定制化的构建流程。本示例将深入探讨如何使用Gradle来构建一个WAR(Web Application Archive)文件,这是...

    Android学习系列之gradle实战

    ### Android学习系列之Gradle实战 #### 一、Gradle Wrapper 概述 在Android开发过程中,Gradle作为构建工具被广泛使用。然而,在多开发者协作的项目中,不同的开发者可能会使用不同版本的Gradle,这可能导致构建...

    spring+gradle学习案例

    在本“spring+gradle学习案例”中,我们将深入探讨如何使用Spring框架、Spring MVC、Hibernate ORM以及Gradle构建一个完整的Web应用程序。这个项目旨在帮助开发者掌握这些技术的集成与应用,实现前后端数据交互,并...

    IDEA中Gradle学习指南.pdf

    ### IDEA中Gradle学习指南 #### 一、基本配置 **1.1 环境变量** Gradle的运行依赖于一系列的环境变量配置。最重要的环境变量为`GRADLE_USER_HOME`,它用于指定Gradle项目的缓存路径。通常情况下,这个路径会被...

    等一分钟——Android项目构建性能优化抛砖引玉的副本.docx

    无论是通过配置Gradle参数来加速构建过程,还是通过模块化和增量构建等方式优化项目结构,都是提高构建效率的有效手段。此外,借助于行业内的成熟解决方案,如Instant Run,也能进一步提升开发效率。

Global site tag (gtag.js) - Google Analytics