一個簡單的Gradle指令碼檔案

leonliu06發表於2018-01-09

  通過一個簡單的Gradle指令碼檔案理解其主要語法:

// build.gradle 檔案
// 建議執行在JDK1.8下,Gradle5.0將不再支援JDK1.7的執行
// Support for running Gradle using Java 7 has been deprecated and is scheduled to be removed in Gradle 5.0.

// 定義 helloword 任務
// 命令列終端執行 gradle -q helloword 輸出 Hello world!
// 選項 -q 表示 --quiet
task helloword {
    // doLast 語句
    doLast {
        println 'Hello world!'
    }       
}

// 可以指定一個快捷鍵(<<符號表示)到 doLast 語句來簡化 helloword 任務
// 但不建議這麼使用,因為<<將在Gradle5.0中刪除
// The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
task hellowordLeftShift << {
    println 'Hello world!';
}

// Gradle 構建指令碼使用 Groovy API
task upper {
    doLast {
        String expString = 'Yiibai gradle totorials'
        println "Original: " + expString
        println "Upper case: " + expString.toUpperCase()
    }
}

// 4次列印隱式引數($it)的值
task count {
    doLast{
        4.times {
            print "$it"
        }
    }
}

// Groovy的JDK方法
// Groovy增加了很多有用的方法到標準的Java類。例如,從Java API可迭代實現它遍歷Iterable介面的元素的 each() 方法。
task groovyJDKMethod {
    doLast {
        String myName = "Yiibai";
        myName.each(){
            println "${it}"
        };
    }
}

task hello

// 定位任務
// 如果要查詢在構建檔案中定義的任務,則必須使用相應的標準專案屬性。這意味著每個任務都可以作為專案的屬性,使用任務名稱作為屬性名稱。
println tasks.hello.name
println tasks['hello'].name

// 任務依賴關係
task intro(dependsOn: 'helloword'){
    doLast{
        println "I'm gradle"
    }
}

task taskX(dependsOn: 'taskY'){
    doLast{
        println "taskX"
    }
}

task taskY{
    doLast{
        println 'taskY'
    }
}

task task1 << {
    println 'compiling source #1'
}

task task2(dependsOn: task1) << {
    println 'compiling unit tests #2'
}

task task3(dependsOn: [task1, task2]) << {
    println 'running unit tests #3'
}

task task4(dependsOn: [task1, task3]) << {
    println 'building the distribution #4'
}

// 另一種方法來新增任務依賴,它就是通過使用閉包。
task taskXLib {
    doLast{
        println 'taskXLib'
    }
}

taskXLib.dependsOn{
    tasks.findAll{
        task -> task.name.startsWith('lib')
    }
}

task lib1 {
    doLast{
        println 'lib1'
    }
}

task lib2 {
    doLast {
        println 'lib2'
    }
}

task notALib {
    doLast {
        println 'notALib' 
    }
}

// 向任務新增描述
// 使用 description 關鍵字可以向任務新增描述,執行Gradle任務時會顯示此描述。
// 執行任務一個task都會顯示,不只是copy
task copy(type: Copy){
    description 'Copies the resource directory to the target directory.'
    from 'resource'
    into 'target'
    include('**/*.txt', '**/*.xml', '**/*.properties')
    println('description applied')
}

// 跳過任務
// 如果用於跳過任務的邏輯不能用謂詞表示,則可以使用 StopExecutionException 。如果操作丟擲此異常,則會跨過此操作的進一步執行以及此任務的後續操作的執行。
task compile {
    doLast{
        println 'We are doing the compile.'
    }
}

compile.doFirst{
    // Here you would put arbitrary conditions in real life.
    // But this is used in an integration test so we want defined behavior.
    if(true){ throw new StopExecutionException() }
}

task myTask(dependsOn: 'compile'){
    doLast{
        println 'I am not affected'
    }
}

// 外掛
/*
* Gradle中有兩種型別的外掛:指令碼外掛和二進位制外掛。
* 指令碼外掛是一個額外的構建指令碼,它提供了一種宣告性方法來操作構建,通常在構建中使用。
* 二進位制外掛是實現外掛介面並採用程式設計方法來操作構建的類。二進位制外掛可以駐留在外掛JAR中的一個構建指令碼和專案層次結構或外部。
* */
apply plugin: 'java'

repositories{
    mavenCentral()
}

// 編寫自定義外掛
// 一個簡單的hello外掛
apply plugin: HelloPlugin

class HelloPlugin implements Plugin<Project> {
    void apply(Project project){
        project.task('hello') {
            doLast {
                println "Hello from the HelloPlugin."
            }
        }
    }
}

// 依賴
/*
* 宣告依賴關係
* Gradle遵循一些特殊語法來定義依賴關係。
* 以下指令碼定義了兩個依賴項,一個是Hibernate core 3.6.7,第二個是Junit 4.0和更高版本。
* 如下面的程式碼所示,可在build.gradle檔案中使用此程式碼。
* */
dependencies{
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

相關文章