2011-10-10 11 views
10

明らかに私はここで何が起こっているのか分かりません。gradleプロジェクトのプロパティを理解しようとしています

prop2とprop3は「プロジェクトプロパティ」ではなく変数なのでアクセスできないようです。

変数「prop2」と「prop3」を「doTheThing()」メソッド内から見ることができますが、それらを渡す必要はありません。なぜなら、変数をグローバルにアクセス可能にしたいのですメソッド、クラス(ビルドスクリプト自体の内部からのみ)に渡すことができます。そして、それらを型付けしたい(これはprop1の定義が受け入れられない理由です)。

本当に、私は、Gradleプロジェクトのプロパティが何であり、 'prop1 = "blah"という構文が実際に何をしているかを理解するのに役立つと思います。

私はGradleユーザーガイドとGradle in Actionも読んでいます。彼らがすでにこのコンセプトを説明していれば、私は正しいセクションを指摘してください(何か言っていることを理解していないときに、

prop1 = "blah" 
String prop2 = "bleah" 
def prop3 = "blargh" 

task testPropAccess << { 
    println "1: $prop1" 
    println "2: $prop2" 
    println "3: $prop3" 
    doTheThing() 
} 

private void doTheThing(){ 
    println "4: $prop1" 
    println "5: $prop2" // error: Could not find property 'prop2' on root project 'script' 
    println "6: $prop3" // error: Could not find property 'prop3' on root project 'script' 
} 
+0

http://groovy.codehaus.org/Scoping+and+the+Semantics+of+%22def%22 – rodion

+0

@Rodion - そのリンクはとても役に立ちました。ありがとうございました。 Groovy指向の研究をいくつか行う必要があると思います。 – Shorn

+0

似たようなことをしたい人にとって、私が望む機能を得るための私の現在の回避策は、このようなクラスで私のビルドスクリプトのワイドプロパティを定義することです: 'class StaticProps { static String prop4 = System.getProperty(" prop4 " 、このようにそれらを使用した後) } ' "wibble" そして: 'はSystem.getProperty( "prop4"、StaticProps.prop4) ' – Shorn

答えて

19

あなたは(2番目と3番目のステートメントのように)最も外側のレベルで変数を宣言し、それがスクリプトのrunメソッドのローカル変数になります。これは本当にGroovyの動作であり、Gradleが簡単に変更できるものではありません。

グローバル変数に相当する場合は、(最初​​のステートメントのように)バインドされていない変数に値を代入します。これにより、GradleのProjectオブジェクトに動的プロパティが追加されます。これは、ビルドスクリプト全体で表示されます(シャドーされていない限り)。つまり、prop1 = "blah"project.prop1 = "blah"に相当します。

型付きのグローバル変数に相当するものが必要な場合は、GradleがGroovy 1.8にアップグレードするまで待つ必要があります。これにより、@Fieldアノテーションで可能になります。または、コンベンションオブジェクトをProjectオブジェクトにミックスするプラグインを作成します(ただし、アドホックスクリプトには適しません)。

+16

この問題を抱えている人にとっては、Peterが示唆していることを実行するときに' ext.prop1 = "blah" 'と書くことをお勧めします。古い技法はまだ動作しますが、廃止され、警告が生成されます。 extを使うことは、新しいプロパティを作成しようとしていることを明示的に示す素晴らしい方法です。あなたが既存の不動産を使っていると思っていて、無意識のうちに新しい不動産を作っているのであれば、それは恐ろしいことかもしれません。 –

+0

こんにちはピーター。簡単な質問ですが、トップレベルのbuild.gradleファイルに 'ext.blah = 'foobar''変数を作成しましたが、' buildscript'のスコープにはありません。 – Bob

+0

これは別の質問でなければなりません(すでに存在しない場合)。 –

関連する問題