试图了解gradle项目属性

Sho*_*orn 10 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'
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ser 19

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

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

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

  • 对于任何偶然发现这一点的人来说,现在建议在做彼得建议的时候写一下`ext.prop1 ="blah"`.较旧的技术仍然有效,但已被弃用并生成警告.使用ext只是一种明确声明您打算创建新属性的好方法.如果你认为你正在使用一个现有的房产并且无意中制造了一个新房产,那么它可能非常令人沮丧,所以这可能是一个非常好的变化. (17认同)
  • @Bob链接到这个问题?我也对这个问题感到好奇! (3认同)