8

是否有一种简单的方法可以在构建配置中转义用于变量替换的魔术字符,以便单独保留字符串。换句话说,我在哪里说:

[part]
attribute = ${variable}

我实际上并不希望它扩展 ${variable} 而是将其保留为文字值。

在实践中,我遇到的具体问题不在构建配置文件本身,而是在配方“collective.recipe.template”处理的模板文件中。这使用了与配置文件中使用的构建相同的变量替换引擎。问题是我想用作模板的文件已经将“${variable}”语法用于其自身目的以及最终使用该文件的应用程序配置系统。

我发现解决这个问题的唯一方法是使用类似的东西:

[server-xml]
recipe = collective.recipe.template
input = templates/server.xml.in
output = ${product:build-directory}/conf/server.xml
dollar = $

在模板输入文件中,然后有:

${dollar}{variable}

代替:

${variable}

它已经有了。

这样做是在使用模板的部分中查找“美元”属性并将其替换为“$”。

而不是必须这样做,有点希望可以这样做:

\${variable}

或者甚至:

$${variable}

并消除了必须有一个虚拟属性来欺骗它做我想做的事情的需要。

查看 buildout 的源代码,它匹配变量替换的方式似乎没有提供转义机制。

如果确实没有办法,那么也许有人知道用于构建的替代模板配方可以进行变量扩展,但为它指示变量的任何方式提供了一种转义机制,这样就可以避免可能存在冲突的问题模板系统扩展机制和被模板化文件中的文字数据。

4

3 回答 3

6

恐怕您对构建变量替换代码(collective.recipe.template 所依赖的)的分析是正确的。没有用于转义${section:variable}变量替换的语法,您提供${dollar}替换的解决方案是我能想到的最佳解决方法。

当然,您也可以向 zc.buildout 团队提出一个补丁,以添加对转义变量替换语法的支持。:-)

于 2009-07-22T11:17:12.060 回答
5

从collective.recipe.template 的1.7 版开始,您可以使用genshi 文本模板,但从1.8 版开始,由于进行了一些修复,它很有用。

recipe = collective.recipe.template[genshi]:genshi
...
mymessage = Hello

所以输入文件看起来像

The message in $${:mymessage} is: ${options['mymessage']}

genshi 允许转义美元,请参阅http://genshi.edgewall.org/wiki/Documentation/templates.html#escaping

有关如何使用 genshi 的更多详细信息,请访问http://pypi.python.org/pypi/collective.recipe.template#genshi-text-templates

于 2011-05-09T15:46:45.827 回答
3

$在 the和 the之间插入一个空替换{应该可以防止 buildout 将结果文本评估为 buildout 替换。

buildout.cfg:

[server-xml]
recipe = collective.recipe.template
input = server.xml.in
output = server.xml
_ =

server.xml.in:

do no substitution $${_}{myvar} blah

服务器.xml:

do no substitution ${myvar} blah
于 2016-05-07T06:43:34.223 回答