在根中定义的闭包在子节点中不可见

时间:2017-01-01 02:30:41

标签: gradle closures multi-project

我有根项目和子项目(: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我需要{child}来调用孩子的构建文件(因为我希望它只能由一些子模块调用)。 documentation似乎足够清晰:foo

但是,将上方的“afterEvaluate”块移至In a multi-project build, sub-projects inherit the properties and methods of their parent project会导致错误:child/build.gradle

为什么会发生这种情况,我该如何解决这个问题?我尝试了一大堆不同的变体 - 将Could not find method foo() for arguments [] on project ':child' of type org.gradle.api.Project移动到(defbuildscript,移至allprojects,移至ext,使其成为变量在ext中,而不是方法等),以不同的方式引用它(如allprojects.extrootProject.foorootProject.foo()等) - 似乎没有任何效果。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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