付録B 陥りがちな罠 Potential Traps

B.1. Groovyスクリプトの変数 Groovy script variables

For Gradle users it is important to understand how Groovy deals with script variables. Groovy has two types of script variables. One with a local scope and one with a script-wide scope.

Gradleユーザーにとって、Groovyがスクリプトの変数をどう扱うか理解しておくことは大事なことです。 Groovyには、二種類のスクリプト変数があります。一つがローカルスコープのもので、もう一つがスクリプトスコープのものです。

例B.1 変数のスコープ:ローカルスコープとスクリプトスコープ

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()

gradle の出力

> gradle 
localScope1
localScope2
scriptScope
localScope1
localScope2
scriptScope
localScope1NotAvailable
localScope2NotAvailable
scriptScope

Variables which are declared with a type modifier are visible within closures but not visible within methods. This is a heavily discussed behavior in the Groovy community. [43]

型修飾のついた変数は、クロージャ内からは見えていますが、メソッドからは見えていません。これは、Groovyコミュニティでもよく議論されている振る舞いです。 [44]

B.2. 設定フェーズと実行フェーズ Configuration and execution phase

It is important to keep in mind that Gradle has a distinct configuration and execution phase (see 56章ビルドのライフサイクル).

Gradleが設定フェーズと実行フェーズを区別していることは常に頭に入れておきましょう。とても重要なことです。(56章ビルドのライフサイクル参照)

例B.2 設定フェーズと実行フェーズの区別

build.gradle

def classesDir = file('build/classes')
classesDir.mkdirs()
task clean(type: Delete) {
    delete 'build'
}
task compile(dependsOn: 'clean') << {
    if (!classesDir.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

As the creation of the directory happens during the configuration phase, the clean task removes the directory during the execution phase.

ディレクトリの作成は設定フェーズで起こっていて、実行フェーズでcleanタスクがそのディレクトリを削除してしまっています。



[44] これらの議論のうちの一つを、ここで見ることができます。 http://groovy.329449.n5.nabble.com/script-scoping-question-td355887.html