Groovy:使用GStringTemplateEngine()的模板引擎中的多个循环 [英] Groovy : multiple loops in template engine using GStringTemplateEngine()

查看:1361
本文介绍了Groovy:使用GStringTemplateEngine()的模板引擎中的多个循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个问题与之前发布的早期问题有关。



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



我的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:
<<需要在这里使用env变量
- name:param1
value:value1
....
>>
项目:$ {PROJECT}
......
......
......
端口:
<<需要在这里使用ports变量
- port:1000
protocol:port1
....
>>

代码片段如下所述。

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

// ....
// envVar来源于另一个文件
// ....

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

println$ {Template}

有人能解释我如何修改上面的代码片段,模板来确保envVar将在模板引擎中被正确替换。 http://docs.groovy-lang.org/next/html/documentation/working-with-collections.html#_iterating_on_a_listrel =nofollow noreferrer> each 为每个变量。您的模板文件需要如下所示:

  #cat output.template 
- env:<%env。每个{v - > %GT;
- name:$ {v.name}
value:$ {v.value}<%}%>
项目:$ {PROJECT}
......
......
......
端口:< %ports.each {v - > %GT;
- port:$ {v.port}
协议:$ {v.protocol}<%}%>

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

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

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

def Template = engine.createTemplate(f).make (envVar)
$ b println$ {Template}。trim()

输出:

  #cat output.template 
- env:
- name:param1
value:value1
- name:param2
value:value2
- name:param3
值:value3
项目:projectName
......
......
......
端口:
- port:1000
protocol:port1
- port:2000
protocol:port2


This question is in continuation with earlier question I have posted before.

To enhance my templates further I need to have multiple loops in the template engines and the values need to be replaced from the HashMap Variables that were derived from a configuration file.

My HashMap looks something like this, let say 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]]
         ]

My template engine looks like this:

   - 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 
        ....
        >> 

Code snippet is described below.

    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}"

Can someone explain me how to modify the above code snippet and templates to make sure the envVar will be replaced properly in the template engine.

解决方案

You need to do an each for every variable. Your template file needs to look like this:

#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}<% } %>

Then, your main script should look like this:

    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()

output:

#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

这篇关于Groovy:使用GStringTemplateEngine()的模板引擎中的多个循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆