Gradle CustomTask不考虑InputFiles的依赖关系

时间:2015-01-06 21:01:42

标签: gradle build.gradle

我正在尝试编写一个自定义Gradle任务,它接受一组特定的输入文件,这些文件可能位于不同的目录中,输出文件并使用输入调用javaexec。

如果它看到@OutputFile存在但是它不考虑InputFiles列表以及它们是否比输出文件更新,我现在有它跳过@TaskAction的地方。

以下是构建文件的相关部分:

class JavaCPPTask extends DefaultTask {
   def className = []
   String outputDir = ""
   String localClasspath = "bin/classes"
   String runIfExists = ""
   String javacpp = "libs/javacpp.jar"
   String outputName = ""

   //@InputDirectory
   //File inputFile = new File("bin/classes/com/package/ve")

   @InputFiles
   List<File> getInputFiles() {
      ArrayList<File> inputFiles = new ArrayList<File>()
      for ( int i = 0; i < className.size(); i++ ) {
         def inputFileStr = localClasspath + '/' + className.get(i).replace('.','/') + '.class' 
         println("InputFileStr: " + inputFileStr )
         File inputFile = new File(inputFileStr)
         println("Input file exists? " + inputFile.exists() )
         inputFiles.add(inputFile)
      }
      return inputFiles
   }


   @OutputFile
   File getTargetFile() {
         if ( outputName.length() == 0 ) {
            def nameWithPackage = className.get(0)
            def name = nameWithPackage.substring(nameWithPackage.lastIndexOf(".")+1)
            outputName = 'jni' + name;
         }

         File outputFile = new File( outputDir + outputName + '.cpp');
         println("Output Name is: " + outputFile )
         println("Output file exists? " + outputFile.exists() )
         return outputFile
   }

   JavaCPPTask() {
   }

   @TaskAction
   def javacpp() {

      def haveFile = new File(runIfExists)
      if ( runIfExists.length() > 0 && ! haveFile.exists() ) {
         println("Skipping class " + className + " makefile does not exist: " + runIfExists );
      }
      else {
         def useOutputName = []
         if ( outputName.length() > 0 ) {
            useOutputName = [ '-o', outputName ]
         }
         def optionArray = [ '-nocompile', '-classpath', localClasspath, '-d', outputDir ]
         def allOptions = [javacpp] + useOutputName + optionArray + className.findAll()

         project.javaexec { main="-jar"; args allOptions }  

      }
   }
}

def codecOpus = ['com.package.ve.CodecOpus']

task javaCPP_CodecOpus(type:JavaCPPTask) {
   className = codecOpus
   outputDir = 'jni/VECodecOpus/'
   runIfExists = outputDir + 'Android.mk'
}

输出,可能有所帮助,也可能没有帮助。输出文件已经由上一次运行创建,但.class文件已更新,所以我希望目标会再次运行。

> c:\java\gradle-2.2.1\bin\gradle  -b build

JavaCPP.gradle javaCPP_CodecOpus
Incremental java compilation is an incubating feature.
InputFileStr: bin/classes/com/package/ve/CodecOpus.class
Input file exists? true
:javaCPP_CodecOpus
InputFileStr: bin/classes/com/package/ve/CodecOpus.class
Input file exists? true
Output Name is: jni\VECodecOpus\jniCodecOpus.cpp
Output file exists? true
Output Name is: jni\VECodecOpus\jniCodecOpus.cpp
Output file exists? true
Output Name is: jni\VECodecOpus\jniCodecOpus.cpp
Output file exists? true
Output Name is: jni\VECodecOpus\jniCodecOpus.cpp
Output file exists? true
InputFileStr: bin/classes/com/package/ve/CodecOpus.class
Input file exists? true
:javaCPP_CodecOpus UP-TO-DATE

BUILD SUCCESSFUL

我做错了什么?

1 个答案:

答案 0 :(得分:0)

通过Gradle源调试后,脚本正常工作。我一直在强制更新和重新编译.java文件,它创建了一个新的.class文件,但Gradle很聪明,知道类文件的内容没有改变。一旦我更改了.java文件中的源并重新编译,Gradle就会正确地将源识别为已更改并重建目标。

猜猜我一直在使用Make太久了。

由于我在开始使用这个兔子洞之前被迫运行一个干净的版本,因此脚本仍然存在问题,但是过时的输入文件不是它。