2016年7月25日 星期一

基本 Build Script (Gradle 1)

gradle官網下載解壓後,設定環境變數,指到bin目錄,然後path加一下
最後到第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

沒有留言:

張貼留言