最後到第16章練習,以下是一些心得
在命令提示字元輸入gradle,就會在「當前目錄」和「C:\Users\使用者名稱」增加一個目錄,叫「.gradle」
要練習的檔案都存成build.gradle,程式碼最後有沒有「;」都可以
打上gradle直接按enter會有提示說要gradle 後要加上task才能執行
如果要看全部的task就要下gradle tasks
gradle --help 看說明
gradle help --task task名稱,可以看到Task的包在org.gradle.api,是個介面
-q是只要印log的意思
※基本task
task hello1 {
doLast {
println 'Hello world1!'
}
}
task hello2 {
doLast {
println 'Hello world2!'
}
}
※gradle hello1
gradle hello2
※把task想成一個method較好理解
※doLast不寫也ok,是最後執行的意思,還有doFirst,下面還會有範例
※<<
task hello1 << {
println 'Hello world1!'
}
task hello2 << {
println 'Hello world2!'
}
※也可以用「<<」
※dependsOn
task hello << {
println 'Hello world!'
}
task intro(dependsOn: hello) << {
// task intro(dependsOn: 'hello') << {
// task intro(dependsOn: "hello") << {
println "I'm Gradle"
}
※intro依賴hello,所以gradle intro時,會先呼叫hello,然後再呼叫自己
※「'」「"」都可以,在這裡沒差別,下面還有範例會說明
※迴圈
task count << {
10.times { print "$it " }
}
※print沒有ln,所以不會換行
※只要是變數,就一定要用「"」,用「'」不行,會把它當字串
※it是內鍵的變數,10.times表示跑10次,一樣從0開始
※自定迴圈變數
task hello1 {
10.times {
xxx -> print "$xxx "
}
}
10.times { c ->
task "xxx$c" << {
println "I'm task number $c"
}
}
※要使用變數,要用「$」開頭
※gradle -q xxx0會印出I'm task number 0
※xxx0~xxx9也會個別印出自己的
※呼叫xxx是不行的,因為task定的名稱後面有變數
※迴圈的依賴
10.times { c ->
task "xxx$c" << {
println "I'm task number $c"
}
}
xxx2.dependsOn xxx4, xxx6, xxx9
※gradle -q xxx2
I'm task number 4
I'm task number 6
I'm task number 9
I'm task number 2
自己會最後執行
※如果下其他的,如gradle -q xxx6不會有依賴,只會印出自己
※執行順序1
task hello << {
println '$hello.name 2'
}
hello.doFirst {
println '$hello.name 1'
}
hello.doLast {
println "$hello.name 3"
}
hello << {
println '$hello.name 4'
}
※以doFirst最先,然後自己,最後是doLast
※如果再呼叫,再排最後,如2和4一樣,但2寫的比較前面,會先執行
※要注意變數用「'」和「"」的差別
※執行順序2
task hello {
doLast {
println '$hello.name 3'
}
doFirst {
println "$hello.name 2"
}
println "$hello.name 1"
}
※執行順序1,是用hello去「.」,這裡直接寫doLast、doFirst
※此時自己是最先執行的,結果如下:
hello 1
hello 2
$hello.name 3
※ext變數
task ooo {
ext.p = "ppp"
}
task xxx << {
println ooo.p
}
※呼叫xxx,可以得到ppp
※預設task
defaultTasks 'ooo', 'xxx'
task xxx << {
println 'I\'m xxx'
}
task ooo << {
println 'I\'m ooo'
}
task other << {
println "I'm not a default task!"
}
※gradle -q會自動呼叫ooo和xxx的task,順序是左邊最先,右邊最後,other當然不會執行
※呼叫不同task,取得不同的version
task ooo << {
println "I\'m $version"
}
task xxx(dependsOn: 'ooo') << {
println 'I\'m xxx'
}
gradle.taskGraph.whenReady {taskGraph ->
if (taskGraph.hasTask(xxx)) {
version = 'xxx'
} else {
version = 'ooo'
}
}
※結果:
gradle -q ooo
I'm ooo
gradle -q xxx
I'm xxx
I'm xxx
※version是內鍵的,不能改
※內鍵的project
task hello {
println project.name
println project.buildDir
}
※project直接點就有一些功能了,還有很多,可按下圖綠色的DSL Reference,然後選右邊的Core types的Project查詢
上面是Properties,下面還有Methods,當然也是可以,以下寫一個瀏覽目錄的程式(修改14.14的範例)
task hello {
// ConfigurableFileTree file = fileTree('C:\\Users\\bruce_java\\Downloads\\mybatis-3.3.0');
// fileContent(file.getDir());
File file = file('C:\\Users\\bruce_java\\Downloads\\mybatis-3.3.0');
println file
fileContent(file);
}
void fileContent(File f) {
fileContent(f, '')
}
void fileContent(File f, String indent) {
def fs = f.listFiles().sort()
fs.each { File file ->
if(file.isDirectory()) {
println indent + "d-$file.name"
fileContent(file, indent + "\t")
} else if(file.isFile()) {
println indent + "l-$file.name"
}
}
}
※Project的file方法回傳java.io.File;而fileTree回傳ConfigurableFileTree,裡面的getDir方法也是回傳java.io.File,所以註解的部分也是可以,只是看起來比較不像純java

沒有留言:
張貼留言