显然,我不明白这里发生了什么。
我想prop2和prop3无法访问,因为它们是变量而不是"项目属性"。
问题出现了,因为我希望变量prop2和prop3在" doTheThing()"中可见。方法,但我不想让它们通过。我希望变量可以全局访问任务,方法和类(但只能从构建脚本本身内部访问) - 我希望它们可以输入(这就是为什么不能接受prop1的定义)。
但实际上 - 我想我要求的是帮助理解Gradle项目属性是什么以及语法' prop1 =" blah"'实际上是在做。
我已经阅读了Gradle用户指南以及Gradle in Action - 如果他们已经解释了这个概念,请指出我正确的部分(也许我在不理解所说的内容时对其进行了掩饰)。
prop1 = "blah"
String prop2 = "bleah"
def prop3 = "blargh"
task testPropAccess << {
println "1: $prop1"
println "2: $prop2"
println "3: $prop3"
doTheThing()
}
private void doTheThing(){
println "4: $prop1"
println "5: $prop2" // error: Could not find property 'prop2' on root project 'script'
println "6: $prop3" // error: Could not find property 'prop3' on root project 'script'
}
答案 0 :(得分:19)
当您在最外层声明变量时(如在第二和第三个语句中),它将成为脚本run
方法的局部变量。这实际上只是Groovy行为,Gradle可以轻易改变。
如果您想要等效的全局变量,只需为未绑定的变量赋值(如第一个语句中所示)。这为Gradle的Project
对象添加了一个动态属性,该对象在整个构建脚本中都可见(除非被遮挡)。换句话说,prop1 = "blah"
相当于project.prop1 = "blah"
。
如果你想要一个类型化的全局变量,你必须等到Gradle升级到Groovy 1.8,这样就可以使用@Field
注释。或者你编写了一个插件,将一个约定对象混合到Project
对象中(但这不适合于临时脚本)。