Groovy的StreamingTemplateEngine呈现PHP模板时抛出MissingPropertyException

时间:2018-07-16 09:46:05

标签: groovy

在Jenkins管道中,我们部署了一个PHP站点,该站点具有PHP格式的配置文件。现在,我们要使用StreamingTemplateEngine创建具有不同内容的这些配置文件(对于开发阶段和生产阶段,请说不同的数据库)。 在PHP中,变量前面带有$-符号,现在与StreamingTemplateEngine中标记为占位符的$-符号冲突。这意味着它在到达PHP变量时会引发异常,应按原样保留。

我认为有一个例子可以使它更清楚:

模板文件test.php.template:

<?php
$my_php_config_variable = "${StreamingTemplateEnginePlaceholder}"
?>

Groovy代码段:

import groovy.text.StreamingTemplateEngine

def placeholders = [
    "StreamingTemplateEnginePlaceholder": "SOME_VALUE",
]
def templateContent = new File('test.php.template').text

def engine = new StreamingTemplateEngine()
def configContent = engine.createTemplate(templateContent).make(placeholders).toString()

println configContent

现在生成的configContent字符串应为:

<?php
$my_php_config_variable = "SOME_VALUE"
?>

但是引擎抛出此异常:

Exception in thread "main" groovy.text.TemplateExecutionException: Template execution error at line 2:
         1: <?php
     --> 2: $my_php_config_variable = "${StreamingTemplateEnginePlaceholder}"
         3: ?>

    at SimpleGroovyScript.run(SimpleGroovyScript.groovy:10)
    at SimpleGroovyScript.main(SimpleGroovyScript.groovy)
Caused by: groovy.lang.MissingPropertyException: No such property: my_php_config_variable for class: groovy.tmp.templates.StreamingTemplateScript1
    ... 2 more

在占位符映射中缺少“ $ my_php_config_variable”。

现在我们的问题是:

1。)是否可以以某种方式将模板中的PHP变量标记为与TemplateEngine一样?

OR

2。)引擎是否可以以某种方式简单地忽略占位符映射中的“丢失”占位符,并按原样保留字符串?

提前提示每一个提示! T0mcat

1 个答案:

答案 0 :(得分:0)

您必须在模板中转义$

<?php
\$my_php_config_variable = "${StreamingTemplateEnginePlaceholder}"
?>

如果您想使用StreamingTemplateEngine来渲染此模板,则必须稍微更新一下代码。 StreamingTemplateEngine在渲染的输出中保留转义符,因此您必须在渲染的模板中将\$替换为$

import groovy.text.StreamingTemplateEngine

def placeholders = [
  "StreamingTemplateEnginePlaceholder": "SOME_VALUE",
]
def templateContent = new File('test.php.template').text

def engine = new StreamingTemplateEngine()
def configContent = engine.createTemplate(templateContent)
    .make(placeholders)
    .toString()
    .replaceAll('\\\\\\\$', '\\\$')

println configContent

输出:

<?php
$my_php_config_variable = "SOME_VALUE"
?>

有一个错误报告GROOVY-8701记录了此问题。 Groovy 2.5.x的将来发行版中应该包含一个修复程序,因此不再需要用\$替换$

或者,您可以使用GStringTemplateEngine-在这种情况下,无需替换转义符:

import groovy.text.GStringTemplateEngine

def placeholders = [
  "StreamingTemplateEnginePlaceholder": "SOME_VALUE",
]
def templateContent = new File('test.php.template').text

def engine = new GStringTemplateEngine()
def configContent = engine.createTemplate(templateContent)
    .make(placeholders)
    .toString()

println configContent

输出:

<?php
$my_php_config_variable = "SOME_VALUE"
?>