Gradle额外属性的范围?

zor*_*b76 6 properties build gradle

我有一个与此类似的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()
}
Run Code Online (Sandbox Code Playgroud)

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

groovy.lang.MissingPropertyException: Cannot get property 'dir' on extra properties extension as it does not exist
Run Code Online (Sandbox Code Playgroud)

无论我尝试什么,我都无法从"分机"中读取任何属性.从方法中可以看出(比如我的例子中的"build()"),但是除了默认的任务之外没有任何其他任务(在我的例子中是"init").

我知道"ext"属性应该可以从项目内的任何地方访问,所以我做错了什么?

更新: 我正在努力实现的工作流程(由Opal提出):

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

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

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

这需要针对每个环境执行

Opa*_*pal 9

应该ext通过project实例创建额外的属性,但是根本不需要任何实例来引用它们:project.dir或者dir,所以对脚本的第一个更改将是:

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()
}
Run Code Online (Sandbox Code Playgroud)

现在,在执行任何任务或方法之前,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()
}
Run Code Online (Sandbox Code Playgroud)