我有根項目和子項目(: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
(到buildscript
,allprojects
,到ext
,到allprojects.ext
,使代替的方法等在其分機一個變量,)中,參照它不同(如rootProject.foo
,rootProject.foo()
,ext.foo()
等) - 似乎沒有任何工作。
任何想法?
好吧,看起來像這樣的作品。現在,接下來的問題是,如何在_all_模塊被評估之後運行它,而不僅僅是這一個?看起來我的下一個問題是,在另一個孩子知道它取決於這個孩子之前,child/foo會被執行。有沒有一個技巧來解決這個問題?我嘗試用'rootProject.afterEvaluate'替換它,但似乎什麼都不做:/ – Dima