1

ここに示されているコード: Gant ファイルには、次のコードがあります。

target(dist: 'Create release artefacts') {
        depends(test)
        depends(jar)
}
target(run: 'Run the distributed jar') {
        depends(dist)
        Ant.java(jar: distributedJarPath, fork: 'true')
}

target(hello: 'Hello World') {
        println("Hello World")
}

setDefaultTarget(dist)

を書き、欠落しているプロパティとしてsetDefaultTarget(dist)例外を受け取らないようにする方法に興味があります。distこのスニペットは何らかのオブジェクトのコンテキストで評価され、ターゲットはインスタンス変数を作成しますか?

4

1 に答える 1

1

考慮する必要がある項目が 2 つあります。スクリプトのバインディングと、ターゲットの宣言方法です。

まずはバインディングです。Groovy スクリプトは、Groovy/Java クラスとは少し異なります。Groovy スクリプトでは、バインドされていない変数を使用できます。つまり、スクリプトをコンパイルするときに、変数を宣言する必要はありません。コンパイラーは、これらの宣言されていない変数参照の 1 つを検出すると、カバーの下にある変数への参照を binding.getVariable(変数名) (またはそれに関連するもの) への呼び出しに変換します。したがって、スクリプトの最後の行は機能的に同等です

setDefaultTarget(binding.getVariable('dist'))

次に、ターゲットの宣言です。ターゲットが宣言されると、Groovy コンパイラーは実際に次のメソッド呼び出しを認識します: target(Map args, Closure Closure) (またはそのあたり)。このメソッドが実行されると、引数が調べられ、ターゲットの名前が抽出され、その名前でクロージャーへのラップされた参照がバインディングに格納されます。概算は..

target(Map args, Closure closure) {
  binding.setVarialbe( 
    args.keySet().iterator().next(),
    gantClosureWrapping(args, closure))
}

もちろん、上記のコードは近似値であり、実際のガント コードではありません。

だから本質的に...

target(dist: 'doc') { ... }
// the above adds 'dist' as a variable to the binding

//...

setDefaultTarget(dist)
// dist is unbound, so it is replaced with binding.getVariable('dist')
于 2010-02-09T19:50:20.150 に答える