Gradle变量范围

时间:2014-11-19 20:28:25

标签: gradle closures scoping

我的根项目我定义了一个变量和一个使用它的方法,如

// An immediately executed closure (I hope)
def myvar = ({-> do something})()

def myfun() {
    println myvar + ":" + project
}

并在子项目中调用它。这会导致错误,如

  

无法在根项目'root'上找到属性'myvar'。

我觉得奇怪,因为myvar在函数定义的范围内(所以我可能做了不同的事情?)。 Ii看起来像动态范围,但我不敢相信。

我知道project.ext,但我不想在其他地方提供myvar

所以我把定义移到了声明中(它现在被多次评估,但是谁在乎),但后来我发现project指的是根项目,而不是调用函数的子项目(词法)作用域)。我可以在没有明确传递的情况下获取当前项目吗?

1 个答案:

答案 0 :(得分:0)

在脚本最外层声明的局部变量不在同一脚本的方法范围内。这是由于Groovy如何将脚本转换为可运行的类。解决此问题的一种方法是使用ext.myfun = { ... }来解决范围问题并且不会影响调用网站(仍然可以使用myfun())。

您的其他问题似乎无关紧要。 project指的是脚本与之关联的项目,并且不是基于调用者确定的。如果不传递调用者的项目是不可能的。但是,可以为每个项目声明ext.myfun,例如在根脚本的allprojects {}块中。