2009-07-16 95 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