美文网首页
(5)增量式构建

(5)增量式构建

作者: 不知名的蛋挞 | 来源:发表于2018-10-21 13:55 被阅读8次

如果我们将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已经不再是最新的了。

相关文章

  • (5)增量式构建

    如果我们将Gradle的Task看作一个黑盒子,那么我们便可以抽象出输入和输出的概念,一个Task对输入进行操作,...

  • Gradle学习5——Gradle增量式构建

    学习本系列前可以下载相关的github项目gradleLearnDemo。地址:https://github.co...

  • Gradle快速入门

    Gradle快速入门创建Task的多种方法读懂Gradle语法增量式构建自定义Property使用java Plu...

  • gradle为什么快

    对,就是针对maven的(手动狗头) 增量的构建 gradle增量的构建应该是包含两个部分,一个是任务的增量执行,...

  • 增量式编码器的相位对齐方法

    增量式编码器的相位对齐方法 增量式编码器的输出信号为方波信号,又能够分为带换相信号的增量式编码器和一般的增量式编码...

  • 初入Vue理解

    Vue.js是一个 基于MVVM构建用户界面的渐进式框架,Vue 采用自底向上增量开发的设计。 Vue.js 支持...

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

    转自:http://www.cnblogs.com/davenkin/p/gradle-learning-4.ht...

  • 前端技术介绍

    Nuxt vue服务端渲染框架 Vue vue是构建用户界面的渐进式框架,自底向上增量开发,只关注视图层,简洁轻量...

  • 【前端学习笔记】Vue的优缺点和其他前端框架的区别

    vue是什么? vue是一套构建用户界面的渐进式框架,即MVVM框架。vue采用自底向上增量开发的设计。vue的核...

  • 2018-09-11 #vue

    初识vue Vue.js 是一套构建用户界面的渐进式框架。 Vue 只关注视图层, 采用自底向上增量开发的设计。 ...

网友评论

      本文标题:(5)增量式构建

      本文链接:https://www.haomeiwen.com/subject/afdbzftx.html