Groovy:使用GStringTemplateEngine()在模板引擎中的多个循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Groovy:使用GStringTemplateEngine()在模板引擎中的多个循环相关的知识,希望对你有一定的参考价值。

这个问题是继续我之前发布过的earlier question

为了进一步增强我的模板,我需要在模板引擎中有多个循环,并且需要从从配置文件派生的HashMap变量中替换值。

我的HashMap看起来像这样,让我们​​说envVar

envVar = [
         PROJECT:name, 
         env:[
             [name:param1, value:value1], 
             [name:param2, value:value2], 
             [name:param3, value:value3]], 
         ports:[
             [protocol:port1, port:1000], 
             [protocol:port2, port:2000]]
         ]

我的模板引擎如下所示:

   - env:
        << NEED TO LOOP HERE WITH env variables 
      - name : param1
        value : value1 
        ....
        >> 
      project: "${PROJECT}"
      ......
      ......
      ......
      ports:
        << NEED TO LOOP HERE WITH ports variables 
      - port: 1000
        protocol : port1 
        ....
        >> 

代码段如下所述。

    def f = new File('output.template')
    def engine = new groovy.text.GStringTemplateEngine()

    //....
    //envVar are derived from another file
    //....

    def Template = engine.createTemplate(f).make(envVar)

    println "${Template}"

有人可以解释我如何修改上面的代码片段和模板,以确保在模板引擎中正确替换envVar。

答案

你需要为每个变量做一个each。您的模板文件需要如下所示:

#cat output.template
- env:<% env.each { v -> %>
  - name : ${v.name}
    value : ${v.value}<% } %>
  project: "${PROJECT}"
  ......
  ......
  ......
  ports:<% ports.each { v -> %>
  - port: ${v.port}
    protocol: ${v.protocol}<% } %>

然后,您的主脚本应如下所示:

    def f = new File('output.template')
    def engine = new groovy.text.GStringTemplateEngine()

    def envVar = [
        PROJECT: name,
        env:[
            [name:'param1', value:'value1'],
            [name:'param2', value:'value2'],
            [name:'param3', value:'value3']
        ],
        ports:[
            [protocol:'port1', port:1000],
            [protocol:'port2', port:2000]
        ]
    ]

    def Template = engine.createTemplate(f).make(envVar)

    println "${Template}".trim()

输出:

#cat output.template
- env:
  - name : param1
    value : value1
  - name : param2
    value : value2
  - name : param3
    value : value3
  project: "projectName"
  ......
  ......
  ......
  ports:
  - port: 1000
    protocol: port1
  - port: 2000
    protocol: port2
另一答案

要浏览您的env变量,您可以使用以下内容:

envVar.env.each{
    println "name : ${it.name}"
    println "value : ${it.value}"
}

envVar.ports.each{
    println "port : ${it.port}"
    println "protocol : ${it.protocol}"
}

以上是关于Groovy:使用GStringTemplateEngine()在模板引擎中的多个循环的主要内容,如果未能解决你的问题,请参考以下文章

Groovy实现热部署

Groovy实现热部署

Groovy实现热部署

在另一个 groovy 中包含一个 groovy 脚本

GroovyGroovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )

蚂蚁如何在groovy中使用