【问题标题】:Scope of the extra properties in Gradle?Gradle 中额外属性的范围?
【发布时间】:2015-07-06 13:53:01
【问题描述】:

我有一个类似这样的 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

无论我尝试了什么,我都无法从“ext”中读取属性。它可以从方法中看到(例如我的示例中的“build()”),但不能从除默认任务(在我的示例中为“init”)之外的任何其他任务中看到。

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

更新: 我试图实现的工作流程(如 Opal 所要求的):

我需要使用一个脚本构建多个环境。这些环境中的每一个都列在一个 CSV 文件中,其中包含一行:&lt;environment&gt;,&lt;version&gt;

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

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

这需要针对每个环境执行

【问题讨论】:

    标签: properties gradle build


    【解决方案1】:

    应通过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()
    }
    

    现在,在执行任何任务或方法之前,脚本会被读取和解析,所以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()
    }
    

    【讨论】:

    • 这正是我想知道应该如何使用额外属性的原因。基本上,我想要一个全局变量。如何在 Gradle 中获取全局变量(不推荐使用的解决方案,在引入额外属性之前使用,不应考虑)?
    • 因此在ext 块中定义它,如果需要覆盖它,请使用-P 命令行开关传递它。
    • 我已经在分机中定义了它。为了获得目录的路径(“dir”变量),我需要使用 -P 传递的另外两个变量,这就是为什么我不能使用“dir”作为构建脚本的参数。哦,好吧……
    • @zorglub76,你能准备一个真实世界的例子吗?如果我了解问题,我会更好地帮助您。
    • 好的,我用我试图自动化的工作流程更新了原始问题。我是 Gradle 的新手,并且希望尽可能地使脚本尽可能 Gradle,但有一次我发现自己几乎在 Groovy 中做所有事情,而不是使用 Gradle 功能,因为意外(看似)缺乏 Gradle 功能。 ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多