Groovy的StreamingTemplateEngine在渲染PHP模板时抛出MissingPropertyException。



在Jenkins Pipeline中,我们部署了一个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变量是否可以以某种方式标记为与模板引擎保持原样?

2.(引擎是否可以简单地忽略占位符映射中"丢失"的占位符,并保持字符串不变?

每一个提示都要提前Thx!T0mcat

您必须在模板中转义$

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

有一个错误报告GROVY-8701记录了这个问题。Groovy2.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"
?>

最新更新