在根中定义的闭包在 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(到 buildscriptallprojects、到 ext、到 allprojects.ext,使它成为一个变量在 ext 中,而不是方法等),以不同的方式引用它(如 rootProject.foorootProject.foo()ext.foo() 等)- 似乎没有任何效果。

有什么想法吗?

需要在 ext 命名空间中声明变量,以便将它们传播到下游。尝试:

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

参考:https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html