在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
答案 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"
?>