在根中定义的闭包在 child 中不可见
Closure defined in root not visible in child
我有根项目和子项目 (:child
)。
根构建看起来像这样:
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
被 child 的构建文件调用(因为我希望它只被一些子模块调用)。
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
,使它成为一个变量在 ext 中,而不是方法等),以不同的方式引用它(如 rootProject.foo
、rootProject.foo()
、ext.foo()
等)- 似乎没有任何效果。
有什么想法吗?
需要在 ext 命名空间中声明变量,以便将它们传播到下游。尝试:
ext.foo = {
println("foo")
}
参考:https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html
我有根项目和子项目 (:child
)。
根构建看起来像这样:
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
被 child 的构建文件调用(因为我希望它只被一些子模块调用)。
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
,使它成为一个变量在 ext 中,而不是方法等),以不同的方式引用它(如 rootProject.foo
、rootProject.foo()
、ext.foo()
等)- 似乎没有任何效果。
有什么想法吗?
需要在 ext 命名空间中声明变量,以便将它们传播到下游。尝试:
ext.foo = {
println("foo")
}
参考:https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html