gradle插件实现增量编译

什么是增量编译

写gradle 脚本的时候,如果task执行的逻辑特别耗时,变会影响整个打包速度,但有的时候我们没有必要去执行task的逻辑,例如在一个Android项目中,只有当我们的java代码变更了,我们变会对java代码进行编译生成.class文件,我们没有更改java代码,那么我们就没必要执行javac的操作,而去直接复用上次编译java代码生成的class文件,这样就可以加快我们的编译速度,增量地编译java代码的task就是一个增量编译的task。

什么样的task是增量编译task呢?首先要有输入文件、输出文件,

  • 当我们输入文件没有变化,什么都不干
  • 当输入文件被添加、修改、之后,执行task逻辑

怎么让一个task实现增量编译呢?

1、写一个task继承DefaultTask
2、定义输入、输出文件

定义输入文件的注解:@Input、@InputDirectory、@InputFile、@InputFiles
定义输出文件的注解:@OutputDirectories、 @OutputDirectory、@OutputFile、@OutputFiles
例如:

  @InputFiles
  List inputFiles

  @OutputFile
  File outputDir
3、用@TaskAction修饰Task执行的逻辑

一个File的添加、删除、修改的变化可以通过InputFileDetails类进行判断,如果有多个inputFile,那么可以通过遍历IncrementalTaskInputs拿到InputFileDetails来判断。

下面是一个拿到路由文件,然后生辰一个路由文档的例子,挨个遍历所有路由文件,当发现有路由文件添加和修改之后,变会重新生成一个路由文档。

 /**
   * Task action that will check if a source file is out of date
   * or removed. If out of date the source file is converted
   * to HTML. If source file is removed the generated
   * HTML file is removed.
   *
   * @param inputs Used for incremental task action.
   */
  @TaskAction
  void generateRouterDoc(IncrementalTaskInputs inputs){

    if (!inputs.incremental) {
      println("incremental is execute")
    }

    boolean isNeedGenerate = false
    // Input file has changed
    inputs.outOfDate { InputFileDetails outOfDate ->
      if(outOfDate.added || outOfDate.modified){
        //如果输入文件有改变,那么我们才生成文档,其它不做任何处理
        println(">>>输入文件发生了改变,需要生成路由文档")
        isNeedGenerate = true
      }
      println("${outOfDate.file.absolutePath} is outOfDate")
    }

    if (!outputDir.exists()) {
      isNeedGenerate = true
    }

    if(isNeedGenerate){
      generateRouterDocument(inputFiles)
    }

    // Input file is removed, so we remove the
    // output file that was created for the input file.
    inputs.removed { InputFileDetails removed ->
      println("${removed.file.name} is removed ")
    }

  }

你可能感兴趣的:(gradle插件实现增量编译)