2017-07-26 157 views
0

我們已經有一個將cobol編譯爲java的gradle項目。這是通過被從gradle這個任務調用一個參數(文件名)一個批處理文件發生:gradle parallel exec命令行

def compileSingleFile(String cblFileName) { 
    exec { 
     commandLine "${projectDir}/compileFile.bat" 
     args "${cblFileName}" 
     ignoreExitValue = true 
    } 
} 

目前,我們通過的文件列表循環,每個文件都被陸續編譯:

task ciBuild { 
    dependsOn collectFiles 
    doLast { 
     cobolfiles.parallelStream().each {file -> 
      if(file.toUpperCase().endsWith("CBL")) { 
       compileSingleFile(file) 
      } 
     } 
    } 
} 

gradle是否有可能在一個線程池中運行此任務?例如每個編譯另一個文件的10個線程?直到列表爲空?

預先感謝您!

回答

0

任務按順序運行,不應該由代碼明確調用。沒有什麼阻止你在doLast { }

如運行project.exec(Closure)

task ciBuild { 
    def cobolFiles = fileTree("src/main/cobol").matching { 
     include "**/*.CBL" 
    } 
    dependsOn collectFiles 
    inputs.files cobolFiles 
    outputs.dir 'path/to/outputDir' 
    doLast { 
     cobolFiles.files.parallelStream().each { File file -> 
      exec { 
       commandLine "${projectDir}/compileFile.bat" 
       args file.absolutePath 
       ignoreExitValue = true 
      } 
     } 
    } 
} 
+0

我需要設置類似「maxParallelForks」什麼? –

+0

我個人不喜歡'parallelStream()',因爲我無法控制線程池。你可能會使用[Executors.newFixedThreadPool(int)](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int))和一個[ CountDownLatch](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html)如果你想完全控制 –