2009-07-16 94 views
7

是否有一种简单的方法来转义buildout配置中用于变量替换的魔法字符,以便字符串保持独立。换句话说,我在哪里说:防止发生变量替换发生

[part] 
attribute = ${variable} 

我实际上并不希望它扩大$ {variable},但将其保留为文字值。

实际上,我遇到的具体问题不在构建配置文件本身,而是在配方'collective.recipe.template'处理的模板文件中。这使用配置文件中使用的buildout中相同的变量替换引擎。问题是我想用作模板的文件已经使用'$ {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的源代码,它匹配变量替换的方式似乎没有提供转义机制。

如果确实没有办法,那么也许有人知道可以做变量扩展的构建的替代模板配方,但是提供了用于表示变量的任何方式的转义机制,以便可以避免可能存在的问题模板系统扩展机制与模板文件中的文字数据之间发生冲突。

回答

5

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

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

1
使用与元史德配方 http://genshi.edgewall.org/wiki/Documentation/templates.html#escaping

更多细节

${之间插入一个空替代应防止构建f rom将结果文本评估为扩展替代。

buildout.cfg:

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

server.xml.in:

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

的server.xml:

do no substitution ${myvar} blah