1.方法的使用
task checksum <<{ fileList('../test').each{ ant.checksum(file:file,property:"cs_$file.name") println "$file.name CheckSum : ${ant.properties["cs_$file.name"]}" }}task loadfile <<{ fileList('../test').each{File file-> ant.loadfile(srcFile:file,property:file.name) println "I'm fond of $file.name" }}File[] fileList(String dir){ file(dir).listFiles({file->file.isFile()} as FileFilter).sort()}
"->"代表賦值,有點類似 lambda文法。
{file->file.isFile()} as FileFilter
這句話是添加了一個判斷條件,對於傳過來的dir是一個檔案名稱的話,就不做處理了。
2.預設任務
defaultTasks 'clean','run'task clean <<{ println 'Default Cleaning!'}task run <<{ println 'Default Running!'}task other <<{ println "I'm not a default task"}
預設任務就是在沒有指定任務名時,這些預設的任務會被執行
qianhuis-Mac-mini:1228 qianhui$ gradle -qDefault Cleaning!Default Running!
上面的預設了任務名,它可以識別這個時候沒有任務執行,但是它會執行預設的任務。
如果指定了任務名,看看輸出是什麼
qianhuis-Mac-mini:1228 qianhui$ gradle -q otherI'm not a default taskqianhuis-Mac-mini:1228 qianhui$ gradle -q runDefault Running!
它就會執行它自己的,這有點像java中某個屬性的預設值,如果你賦予一個新的值,預設值就不會起作用。
在多項目的構建中,子項目可以有自己的預設任務,如果子項目沒有,會預設使用繼承父項目的預設任務。
3.使用DAG(有向非循環圖表)進行配置
gradle分設定階段和執行階段,設定階段完成後,gradle就知道所有需要被執行的任務。這樣我們就可以利用這些資訊瞭解哪些任務被執行了。下面的例子來判斷任務執行完成後,release任務是否被執行
task distribution <<{ println "We build the zip with version = $version"}task release (dependsOn :'distribution')<<{ println 'We release now'}gradle.taskGraph.whenReady { taskGraph-> if(taskGraph.hasTask(release)){ version = '1.0' }else { version = '1.0-SNAPSHOT' }}~
輸出
qianhuis-Mac-mini:1228 qianhui$ gradle -q distributionWe build the zip with version = 1.0-SNAPSHOT
說明上面的DAG中存在release任務,說明release不會被執行。
qianhuis-Mac-mini:1228 qianhui$ gradle -q releaseWe build the zip with version = 1.0We release now
說明上面的DAG中存在release任務,說明release會被執行。
上面的代碼中需要注意的一點是whenReady,它會在任務執行前起作用。