2017-01-01 12 views
2

我有根項目和子項目(:child)。 根構建看起來是這樣的:在root中定義的關閉在子中不可見

def foo = { 
    println("foo") 
} 

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

    afterEvaluate { 
    foo() 
    } 
} 

運行gradle bar打印:

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

這是有意義的。但是,IRL我需要foo由孩子的構建文件調用(因爲我希望它只能被某些子模塊調用)。 的documentation似乎是足夠清楚的:In a multi-project build, sub-projects inherit the properties and methods of their parent project

然而,在移動「afterEvaluate」塊上方插入child/build.gradle導致錯誤:Could not find method foo() for arguments [] on project ':child' of type org.gradle.api.Project

爲什麼會發生這種情況,我該如何解決這個問題?我已經嘗試了一大堆不同的變化 - 四處移動def(到buildscriptallprojects,到ext,到allprojects.ext,使代替的方法等在其分機一個變量,)中,參照它不同(如rootProject.foorootProject.foo()ext.foo()等) - 似乎沒有任何工作。

任何想法?

回答

1

需要在ext名稱空間中聲明變量以便將它們傳播到下游。嘗試:

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

裁判:https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html

+0

好吧,看起來像這樣的作品。現在,接下來的問題是,如何在_all_模塊被評估之後運行它,而不僅僅是這一個?看起來我的下一個問題是,在另一個孩子知道它取決於這個孩子之前,child/foo會被執行。有沒有一個技巧來解決這個問題?我嘗試用'rootProject.afterEvaluate'替換它,但似乎什麼都不做:/ – Dima

相關問題