我有根项目和子项目(: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