2017-01-01 6 views
2

私はルートプロジェクトとサブプロジェクト(:child)を持っています。 ルートのビルドは、次のように次のようになります。rootで定義されたクローズが子に表示されない

foo 
foo 
:bar 
:child:bar 
child:bar 
parent:bar 

このメイクセンス:

def foo = { 
    println("foo") 
} 

allprojects { 
    task bar << { 
    println(project.name + ":bar") 
    } 

    afterEvaluate { 
    foo() 
    } 
} 

gradle barプリントを実行します。しかし、私はfooを子のビルドファイルから呼び出す必要があります(サブモジュールのいくつかだけが呼び出されるためです)。 documentationは十分に明確であるように思わ:In a multi-project build, sub-projects inherit the properties and methods of their parent project

しかし、エラーでchild/build.gradle結果に上記の「afterEvaluate」ブロックを移動:Could not find method foo() for arguments [] on project ':child' of type org.gradle.api.Project

なぜこれが起こり、どうすればこの問題を解決できますか?私は、さまざまなバリエーションの全体の束を試みた - 周りdef移動(extbuildscriptに、allprojectsを、allprojects.extに、その内線可変製造、代わりの方法などの)異なるそれを参照(rootProject.foorootProject.foo()として、ext.foo()など) - 何も動作していないようです。

アイデア?

答えて

1

Varsをextネームスペースで宣言して下流に伝播させる必要があります。試してみてください:https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html

+0

[OK]を、この作品のようになります。

ext.foo = { println("foo") } 

参照。さて、次の質問は、_all_モジュールが評価された後、これを実行するにはどうすればよいのでしょうか?私の次の問題は、別の子供がそれに依存していることを知る前にchild/fooが実行されることです。それを修正するトリックはありますか?私はそれを 'rootProject.afterEvaluate'と置き換えようとしましたが、それはまったく何もしないようです:/ – Dima

関連する問題