试图了解gradle项目属性

时间:2011-10-10 07:28:08

标签: gradle

显然,我不明白这里发生了什么。

我想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'
}

1 个答案:

答案 0 :(得分:19)

当您在最外层声明变量时(如在第二和第三个语句中),它将成为脚本run方法的局部变量。这实际上只是Groovy行为,Gradle可以轻易改变。

如果您想要等效的全局变量,只需为未绑定的变量赋值(如第一个语句中所示)。这为Gradle的Project对象添加了一个动态属性,该对象在整个构建脚本中都可见(除非被遮挡)。换句话说,prop1 = "blah"相当于project.prop1 = "blah"

如果你想要一个类型化的全局变量,你必须等到Gradle升级到Groovy 1.8,这样就可以使用@Field注释。或者你编写了一个插件,将一个约定对象混合到Project对象中(但这不适合于临时脚本)。