2017-07-07 4 views
1

がどのように拡張プロパティを同時に閉鎖し、オブジェクトを取る方法のように振る舞うん

apply plugin: 'groovy' 

ext.foo1 = 'bar1' 
ext { 
    foo2 = 'bar2' 
} 
assert foo1 == 'bar1' 
assert foo2 == 'bar2' 

のようにこれはかっこいい正当なものであるが、私は理由を理解していない、あなたのbuild.gradleは非常に簡単であると仮定します。 2番目のextへの参照では、extは、その所有者をextのインスタンスに設定するクロージャをとるメソッドのように扱われます。しかし、最初のリファレンスでは、ExtraPropertiesインスタンスのように動作します。

println ext.class.name 

「クラス」がextに存在しないため、実際にはエラーが発生します。エクステンションはextensions.create(...)によって追加されたExtensionAwareインターフェースが動的に追加された通常のオブジェクトです。しかし、それは遠くに、かなり合理的な推測です。

これらのプロパティがどのように設定されているのかわかりません。ドキュメンテーションは、プロパティの拡張がどのように動作するのか、どのように機能するのかについてのみ明確になっています。誰でも説明できますか?

(1)ビルドスクリプトで 'prop1'が参照されている場合、groovyはproject.ext.prop1に行くことをどのように知っていますか? (2)「ext」とは何ですか?

答えて

0

次変更したスクリプトは、あなたに理解してもらう必要があります。

apply plugin: 'groovy' 

ext.foo1 = 'bar1' 
ext { 
    println "log1:: ${it.getClass()} ${System.identityHashCode(it)}" 
    foo2 = 'bar2' 
} 

println "log2:: ${ext.getClass()} ${System.identityHashCode(ext)}" 

assert foo1 == 'bar1' 
assert foo2 == 'bar2' 

出力:

log1:: class org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension 464908575 
log2:: class org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension 464908575 

ext{ ... }ext.with{ ... }

に等しいことを意味し
関連する問題