2017-04-25 3 views
1

badタスクを持つ最小限のbuild.gradleファイルがあります。タスクからグローバル変数を参照すると私のgradleタスクがなくなります

def owner = 1 

task('bad') { 
    doLast { 
     println "My owner is, ${owner}" 
    } 
} 

task good { 
    doLast { 
     println 'This is good' 
    } 
} 

これが出力されます:私は私の奇妙なエラーを与え、これが動作しない理由を理解したいと思います

FAILURE: Build failed with an exception. 

* Where: 
Build file 'test\build.gradle' line: 4 

* What went wrong: 
A problem occurred evaluating root project 'test'. 
> No signature of method: build_6t4ha87o2gnjb2kllhp0wwfpi$_run_closure1.doLast() is applicable for argument types: (build_6t4ha87o2gnjb2kllhp0wwfpi$_run_closure 
1$_closure4) values: [[email protected]] 
Possible solutions: doCall(), doCall(java.lang.Object), collect(), collect(), isCase(java.lang.Object), isCase(java.lang.Object) 

* Try: 
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 

BUILD FAILED 

しかし、単にのprintlnからownerへの参照を削除するかだけでも、名前の変更私のグローバルowner変数はowner1になります。私はいくつかのgradleの内部を妨害しているように見えますが、正確な方法は分かりません。

私はこの実験ではgradle 3.4を使用しています。

答えて

1

想像通り、ownerが内部で使用されています。具体的には、GroovyクラスClosureによって使用されます。 あなたがownerdefとして、あなたのowner変数に変換したり、GETメソッドgetOwner()(つまりownerに変換されます)を参照している場合、コンパイラは知らない宣言するときには、そのように定義されClosureを持つタスクの中にあります。

あなたは(あなたがあなたの所有者の宣言を削除した後で)以前の出現は、このように発見されたことを確認することができます

task verifyOwnerExistence { 
    println "Owner exists: ${owner != null}" 
} 
関連する問題