最後到第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
沒有留言:
張貼留言