【问题标题】:Gradle: define variables within a scope?Gradle:在范围内定义变量?
【发布时间】:2017-06-27 19:42:09
【问题描述】:

在 Gradle 中,我们可以像下面这样定义和访问变量吗?在范围(命名空间)内定义变量的更方便的方法。

foo {
   bar1 {
      variable1 = 'hello';
      variable2 = 'hello2';
   }

   bar2 {
      variable1 = 'hello';
      variable2 = 'hello2';
   }

}

println foo.bar1.variable1
println foo.bar2.variable2

或者需要地图

foo = [bar1 : [variable1 : 'hello', 
               variable2 : 'hello2'
              ],
       bar2 : [variable1 : 'hello', 
               variable2 : 'hello2'
              ]
]

【问题讨论】:

    标签: variables dictionary gradle groovy scope


    【解决方案1】:

    您应该使用ConfigSlurper

    foo.groovy中设置你的变量

    foo {
        bar1 {
            variable1 = 'hello'
            variable2 = 'hello2'
        }
        bar2 {
            variable1 = 'hello'
            variable2 = 'hello2'
        }
    }
    

    然后加载它

    ConfigSlurper foo = new ConfigSlurper().parse(new File('/path/to/foo.groovy').toURI().toURL())
    
    println foo.bar1.variable1
    println foo.bar2.variable2
    

    【讨论】:

    • 在属性文件中定义不支持groovy对象,只支持字符串。
    • @eastwater 这不是真的。 ConfigSlurper 读取的文件是一个 Groovy 脚本。您可以使用 Groovy 语法,计算东西,从另一个变量中引用一个变量,...。示例中的命名 .properties 完全是错误的。
    • 确实,foo.groovy 会更好
    • @ToYonos,刚刚根据评论进行了编辑。希望这没问题。
    【解决方案2】:

    我通常看到它完成的方式是在单独的脚本中使用 ext

    gradle/common.gradle:

    ext {
        foo = [
            bar1: [
                variable1 : 'hello',
                variable2 : 'hello2'
            ],
            bar2: [
                variable1 : 'hello',
                variable2 : 'hello2'
            ]
        ]
    }
    

    然后在你的构建脚本中;

    applyScript 'common.gradle'
    

    【讨论】:

      【解决方案3】:

      如果想在gradle tasks 中实现localglobal 作用域,我们可以这样做,

      def version = "3.0"
      
      task Task1 {
          description "sample task #1"
          doLast {
              version = "1.0"
              println "exec doLast - task 1"
              println "since verison - $version"
          }
      }
      
      task Task2 {
          description "sample task #2"
          doLast {
              version = "1.0"
              println "exec doLast - task 2"
              println "since verison - $version"
          }
      }
      
      task Task3 {
          description "sample task #3"
          dependsOn Task1
          doLast {
              version = "2.0"
              println "exec doLast - task 3"
              println "since verison - $version"
          }
      }
      
      task Task4 {
          description "sample task #4"
          dependsOn Task3, Task2
          doLast {
              println "exec doLast - task 4"
              println "since verison - $version"
          }
      }
      

      这会创建一个全局变量version,然后每个任务都会根据使用情况创建一个局部变量version

      工作
      由于局部变量是在doLast 中定义的,因此它们是在运行task 时创建的,而不是在gradle 构建生命周期的configuration 步骤中创建的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-18
        • 2015-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        • 2018-06-29
        相关资源
        最近更新 更多