防止使用buildout发生变量替换

Gra*_*ton 8 python buildout

是否有一种简单的方法可以在buildout配置中转义用于变量替换的魔术字符,这样就可以保留字符串.换句话说,我说的地方:

[part]
attribute = ${variable}
Run Code Online (Sandbox Code Playgroud)

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

实际上,我遇到的具体问题不是在buildout配置文件本身,而是在由配方'collective.recipe.template'处理的模板文件中.这使用配置文件中使用的buildout中的相同变量替换引擎.问题是我想用作模板的文件已经将'$ {variable}'语法与最终使用该文件的应用程序配置系统结合使用.

我找到解决问题的唯一方法是使用类似的东西:

[server-xml]
recipe = collective.recipe.template
input = templates/server.xml.in
output = ${product:build-directory}/conf/server.xml
dollar = $
Run Code Online (Sandbox Code Playgroud)

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

${dollar}{variable}
Run Code Online (Sandbox Code Playgroud)

代替:

${variable}
Run Code Online (Sandbox Code Playgroud)

它已经有了.

这样做是因为使用模板对该部分查找'dollar'属性并将其替换为'$'.

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

\${variable}
Run Code Online (Sandbox Code Playgroud)

或者甚至是:

$${variable}
Run Code Online (Sandbox Code Playgroud)

并且消除了必须具有虚拟属性以欺骗它做我想要的事情的需要.

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

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

Mar*_*ers 6

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

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


jen*_*ens 5

从collective.recipe.template的1.7版本开始,你可以使用genshi文本模板,但是从版本1.8开始,它有用,因为它有一些修复.

recipe = collective.recipe.template[genshi]:genshi
...
mymessage = Hello
Run Code Online (Sandbox Code Playgroud)

所以输入文件看起来像

The message in $${:mymessage} is: ${options['mymessage']}
Run Code Online (Sandbox Code Playgroud)

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

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