Groovy 腳本變數

對於 Groovy DSL 的使用者而言,了解 Groovy 如何處理腳本變數非常重要。Groovy 有兩種腳本變數。一種具有區域範圍,另一種具有腳本範圍。

範例:變數範圍:區域和腳本範圍

scope.groovy
String localScope1 = 'localScope1'
def localScope2 = 'localScope2'
scriptScope = 'scriptScope'

println localScope1
println localScope2
println scriptScope

closure = {
    println localScope1
    println localScope2
    println scriptScope
}

def method() {
    try {
        localScope1
    } catch (MissingPropertyException e) {
        println 'localScope1NotAvailable'
    }
    try {
        localScope2
    } catch(MissingPropertyException e) {
        println 'localScope2NotAvailable'
    }
    println scriptScope
}

closure.call()
method()
groovy scope.groovy 的輸出
> groovy scope.groovy
localScope1
localScope2
scriptScope
localScope1
localScope2
scriptScope
localScope1NotAvailable
localScope2NotAvailable
scriptScope

使用類型修改項宣告的變數在閉包中可見,但在方法中不可見。

組態和執行階段

請務必記住,Gradle 有不同的組態和執行階段(請參閱 建置生命週期)。

build.gradle.kts
val classesDir = file("build/classes")
classesDir.mkdirs()
tasks.register<Delete>("clean") {
    delete("build")
}
tasks.register("compile") {
    dependsOn("clean")
    val classesDir = classesDir
    doLast {
        if (!classesDir.isDirectory) {
            println("The class directory does not exist. I can not operate")
            // do something
        }
        // do something
    }
}
build.gradle
def classesDir = file('build/classes')
classesDir.mkdirs()
tasks.register('clean', Delete) {
    delete 'build'
}
tasks.register('compile') {
    dependsOn 'clean'
    def localClassesDir = classesDir
    doLast {
        if (!localClassesDir.isDirectory()) {
            println 'The class directory does not exist. I can not operate'
            // do something
        }
        // do something
    }
}
gradle -q compile 的輸出
> gradle -q compile
The class directory does not exist. I can not operate

由於目錄的建立發生在組態階段,因此 clean 任務會在執行階段移除目錄。