Gradle中额外属性的范围?

时间:2015-07-06 13:53:02

标签: properties gradle build

我有一个类似的Gradle脚本:

ext {
  dir = null
}

task init << {
  build()
}

task buildAll(type: Exec){
  workingDir ext.dir
  commandLine 'cmd', '/c', "echo %JAVA_HOME%"
}

def build(){
  ext.dir = "asdf"
  buildAll.execute()
}

当我运行脚本时,我得到:

groovy.lang.MissingPropertyException: Cannot get property 'dir' on extra properties extension as it does not exist

无论我做了什么,我都无法从&#34; ext&#34;中读取任何财产。它可以从方法中看到(例如&#34; build()&#34;在我的例子中),但不是来自除默认任务之外的任何其他任务(&#34; init&#34;在我的例子中)。

我明白&#34;分机&#34;属性应该可以从项目内的任何地方访问,所以我做错了什么?

更新 我试图实现的工作流程(由Opal提出):

我需要使用一个脚本构建几个环境。这些环境中的每一个都列在CSV文件中,其中包含以下行:<environment>,<version>

然后脚本需要执行以下操作:

  • 删除现有目录
  • 从SVN到新目录的结账代码(目录和SVN网址都取决于环境和版本)
  • 复制一些设置文件(路径取决于版本)
  • 编辑其中一些设置文件(值取决于环境和版本)
  • 设置一些环境变量(JAVA_HOME,ANT_HOME ...)(取决于版本)
  • 运行三个构建命令(${ANT_HOME}/bin/ant -f $checkedOutCodeDirectory/Build/build-all.xml target1,然后target2target3

这需要针对每个环境执行

1 个答案:

答案 0 :(得分:8)

应该通过ext创建额外的属性,但是通过project实例引用,而不需要任何实例:project.dirdir,因此对脚本的第一次更改将是:

ext {
  dir = null
}

task init << {
  build()
}

task buildAll(type: Exec){
  workingDir dir // ext.dir -> dir
  commandLine 'cmd', '/c', "echo %JAVA_HOME%"
}

def build(){
  ext.dir = "asdf"
  buildAll.execute()
}

现在,在执行任何任务或方法之前,会读取并解析脚本,在{em>运行任何其他部分之前,将buildAll的整个部分配置 。因此它总是会失败,因为dir属性没有价值。证明:

ext {
  dir = null
}

task init << {
  build()
}

task buildAll(type: Exec){
  workingDir dir ? dir : project.rootDir 
  commandLine 'cmd', '/c', "echo %JAVA_HOME%"
}

def build(){
  ext.dir = "asdf"
  buildAll.execute()
}