【问题标题】:Groovy : multiple loops in template engine using GStringTemplateEngine()Groovy:使用 GStringTemplateEngine() 的模板引擎中的多个循环
【发布时间】:2018-03-27 13:52:11
【问题描述】:

这个问题是我之前发过的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 
        ....
        >> 

代码 sn-p 如下所述。

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

谁能解释我如何修改上面的代码 sn-p 和模板以确保 envVar 将在模板引擎中正确替换。

【问题讨论】:

    标签: groovy template-engine


    【解决方案1】:

    您需要为每个变量创建一个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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-31
        • 2012-09-04
        • 1970-01-01
        • 2017-06-01
        • 1970-01-01
        • 2015-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多