使用案例:我有一大堆必須由腳本進行處理之前,我建我的應用程序圖像。在makefile中,我可以簡單地定義:在搖籃中創建的makefile樣通配符目標
processed/%.png: original/%.png
script/process.sh $< [email protected]
如何在Gradle中實現此操作?具體來說,我希望它能像Makefile一樣工作,只有修改過的原始圖像會被再次處理。
使用案例:我有一大堆必須由腳本進行處理之前,我建我的應用程序圖像。在makefile中,我可以簡單地定義:在搖籃中創建的makefile樣通配符目標
processed/%.png: original/%.png
script/process.sh $< [email protected]
如何在Gradle中實現此操作?具體來說,我希望它能像Makefile一樣工作,只有修改過的原始圖像會被再次處理。
可以實現這一行爲爲增量的任務,使用IncrementalTaskInputs作爲輸入參數。該API文檔包含一個例子,如何使用它,並here is an example in another the documentation。他們兩人幾乎完全符合你的需求。
增量任務操作是接受單個 IncrementalTaskInputs參數的操作。然後,該任務可以提供一個動作 執行對已過時的關於 上一次執行任務,併爲自上次執行已經取消了所有 輸入文件的單獨行動的所有輸入文件。
在搖籃無法確定哪個輸入文件需要 重新處理,則所有的輸入文件將被報告爲 IncrementalTaskInputs.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
。但增量任務應該仍然有效。