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]
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
タスクがそのディレクトリを削除してしまっています。
[43] One of those discussions can be found here: http://groovy.329449.n5.nabble.com/script-scoping-question-td355887.html
[44] これらの議論のうちの一つを、ここで見ることができます。 http://groovy.329449.n5.nabble.com/script-scoping-question-td355887.html