2017-04-11 59 views
2

使用案例:我有一大堆必須由腳本進行處理之前,我建我的應用程序圖像。在makefile中,我可以簡單地定義:在搖籃中創建的makefile樣通配符目標

processed/%.png: original/%.png 
    script/process.sh $< [email protected] 

如何在Gradle中實現此操作?具體來說,我希望它能像Makefile一樣工作,只有修改過的原始圖像會被再次處理。

回答

1

可以實現這一行爲爲增量的任務,使用IncrementalTaskInputs作爲輸入參數。該API文檔包含一個例子,如何使用它,並here is an example in another the documentation。他們兩人幾乎完全符合你的需求。

增量任務操作是接受單個 IncrementalTask​​Inputs參數的操作。然後,該任務可以提供一個動作 執行對已過時的關於 上一次執行任務,併爲自上次執行已經取消了所有 輸入文件的單獨行動的所有輸入文件。

在搖籃無法確定哪個輸入文件需要 重新處理,則所有的輸入文件將被報告爲 IncrementalTask​​Inputs.outOfDate(org.gradle.api.Action)的情況。

在您的任務中,使用exec任務調用腳本。然後,您的搖籃腳本可能是這樣的:

task processRawFiles(type: ProcessRawFiles) 

class ProcessRawFiles extends DefaultTask { 
    @InputDirectory 
    File inputDir = project.file('src/raw') 

    @OutputDirectory 
    File outputDir = project.file('build/processed') 

    @TaskAction 
    void execute(IncrementalTaskInputs inputs) { 
     if (!inputs.incremental) 
      project.delete(outputDir.listFiles()) 

     inputs.outOfDate { InputFileDetails change -> 
      File saveTo = new File(outputDir, change.file.name) 
      project.exec { 
       commandLine 'script/process.sh', change.file.absolutePath, saveTo.absolutePath 
      } 
     } 

     inputs.removed { InputFileDetails change -> 
      File toDelete = new File(outputDir, change.file.name) 
      if (toDelete.exists()) 
       toDelete.delete() 
     } 
    } 
} 

這個任務會在src/raw圖像。它會從build目錄中刪除文件,並在任何過期或新添加的文件上調用腳本。如果您有分散在多個目錄中的圖片

你的具體情況可能會更加複雜。在這種情況下,你將不得不使用@InputFiles,而不是@InputDirectory。但增量任務應該仍然有效。