どのようにガントは、その名前で目標を参照して、不足しているプロパティの例外を取得しないことができるのですか?

StackOverflow https://stackoverflow.com/questions/2231972

質問

ここに提示したコードでは:ガントファイルに、次のコードがあります:

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についての例外を受信しないことができますどのように興味があります。このスニペットは、いくつかのオブジェクトのコンテキストで評価され、ターゲットはインスタンス変数を作成していますか?

役に立ちましたか?

解決

2つのあなたが考慮する必要がある項目は、スクリプトの結合、およびどのようにターゲットが宣言されているがあります。

まず結合があります。 Groovyのスクリプトは、Groovyの/ Javaクラスから少し異なっています。 Groovyのスクリプトは、結合していない変数が可能になります。あなたは、変数を宣言する必要はありませんスクリプトをコンパイルするときの意味。コンパイラはこれらの宣言されていない変数の参照のいずれかを見ているとき、それはbinding.getVariableへの呼び出し(変数名)(か何かの周り)にカバーの下に変数にrefrenceを変換します。だから、スクリプトの最後の行は、

と機能equivilantです
setDefaultTarget(binding.getVariable('dist'))

第二のターゲットの宣言でもあります。ターゲット(地図引数、クロージャ閉鎖)(またはその付近):ターゲットが宣言されるとGroovyのコンパイラが実際にメソッド呼び出しを見ています。この方法が実行されたときは、引数を検査対象の名前を抽出し、結合にその名前によって閉鎖にいくつかのラップされた参照を格納します。 appropximationは次のようになります..

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')
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top