[Gradle]Quick Start 系列-3 熟悉基本Script語法
每日一字 in Gradle:
- projects 專案: 在軟體中包含多個可被建置的元件. 如: 常用的以interface layer的jar, web application的war ... 等. Gradle可處理一個或多個專案.
- tasks 任務: 每一個建置動作的元素. 如: 編譯, 建立jar, 建立javadoc, 佈署 ... 每一個專案會包含多個任務.
在build檔案中的task 宣告方式如下:
1: task myTask
2: task myTask { configure closure }
3: task myType << { task action }
4: task myTask(type: SomeType)
5: task myTask(type: SomeType) { configure closure }
註: << 等同於 doLast
先簡單會一些gradle 及 Groove 語法
- 新增一個任務
task shortcut << {
println 'shortcut'
}
- 使用Groovy 語法
task groovy_dsl << {
4.times { print "$it\n" }
}
- 使用任務依賴 ( 前後順序無影響)
task a(dependsOn: 'b') << {
println 'a'
}
task b << {
println 'b'
}
- 使用動態 task ?! (強大, 可用在相似但有部份不同的狀況)
4.times { counter ->
task "dynamic_$counter" << {
println "My name is dynamic_$counter"
}
}
- 異常: Could not determine which task to execute. (打錯字啦當然找不到囉)
- 相較於 ANT 的ref , gradle script 可以更簡單直接參考既有task
4.times { counter ->
task "dynamic_$counter" << {
println "My name is dynamic_$counter"
}
}
dynamic_0.dependsOn dynamic_1, dynamic_2
- 每一事件都可以重覆宣告, 不會後蓋前
task c
c.doFirst {
println 'first'
}
c.doLast {
println 'last'
}
c << {
println 'the end'
}
- 將參數抽離, 並在任務中使用
task myPrpts
myPrpts.ip='192.168.0.1'
myPrpts.user='user'
myPrpts.password='password'
task d << {
println "$myPrpts.ip $myPrpts.user $myPrpts.password"
}
- 如果之前的專案已經有穩定的ANT build file, 那也不需要重新編gradle script, 直接整合進來使用即可.
ant.importBuild './ant/build.xml'
execute << {
println 'the end'
}
build.xml
<project name="my" default="execute">
<target name="execute">
<echo message="Ant say: Hello world" />
</target>
</project>
- 除task外也可以宣告方法(Function)
task listGradle << {
showFiles('.')
}
task listAnt(dependsOn: 'listGradle') << {
showFiles('./ant')
}
File[] showFiles(String dir) {
def files = file(dir).listFiles({file -> file.isFile() } as FileFilter).sort()
files.each { File file ->
if(file.isFile()){
println "** $file.name **"
}
}
}
- 如同ANT 可以設Defatult target , gradle 亦可設定default task
defaultTasks 'defaultTask_1', 'defaultTask_2'
task defaultTask_1 << {
println 'defaultTask1'
}
task defaultTask_2 << {
println 'defaultTask2'
}
- 在Gradle生命周期中, 我們可以在組態結束後, 實際執行前, 插入一些行為, 如: 依據組態結果或執行的任務項來加入額外的資訊.
task eatApple << {
println "Eating a $size apple."
}
task eatOrange(dependsOn: 'eatApple') << {
println 'Eating a big orange.'
}
gradle.taskGraph.whenReady { taskGraph ->
if(taskGraph.hasTask(eatOrange)){
size = 'small' ;
} else {
size = 'big' ;
}
}
- 字串中的單引號跟雙引號不同, 前者為常數, 後者則可加入一些變數.
task myP
myP.word='go lunch'
task singleQuote << {
println 'It is $myP.word !!'
}
task doubleQuote(dependsOn: 'singleQuote') << {
println "It is $myP.word"
}