zoukankan      html  css  js  c++  java
  • 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-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是否为最新,这个方法接受一个闭包作为检查条件,有兴趣的读者可以自行了解。
     

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    SAS 数据集生成map 文件
    尝试打开或创建物理文件 REATE FILE 遇到操作系统错误 5(拒绝访问)
    sas编程-日期相差计算函数 intnx
    msqlserver 千万级别单表数据去掉重复记录使用临时表
    bootstrap下使用模态框,在模态框内输入框中回车时,模态框自动关闭的问题及解决方法
    .net 环境下get 获取页面出现乱码问题解决
    关于富文本编辑框与纯文本编辑框初始化加载过程的问题
    SVN版本问题:svn: E155021: This client is too old to work with the working copy at
    new一个对象时,会经历哪些步骤
    var、let、const区别
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4709747.html
Copyright © 2011-2022 走看看