2009-07-16 4 views
7

Gibt es eine einfache Möglichkeit, die magischen Zeichen der Flucht für die Variablensubstitution in einer buildout Konfiguration verwendet, so dass die Zeichenfolge allein gelassen wird. Mit anderen Worten, wo ich sage:Verhindern variable Substitutionen von mit buildout auftretenden

[part] 
attribute = ${variable} 

ich nicht wirklich es $ wollen {variable} aber lassen Sie es als Literalwert erweitern.

In der Praxis das spezifische Problem, das mir begegnet ist, ist nicht in der buildout Konfigurationsdatei selbst, sondern in einer Vorlagendatei durch das Rezept ‚collective.recipe.template‘ verarbeitet. Dies verwendet dieselbe Variablensubstitutionsengine von Buildout, die in den Konfigurationsdateien verwendet wird. Problem ist, dass die Datei, die ich als Vorlage verwenden möchte, bereits die '$ {variable}' - Syntax für ihre eigenen Zwecke in Verbindung mit dem Anwendungskonfigurationssystem verwendet, das letztendlich die Datei konsumiert.

Der einzige Weg, die ich gefunden habe, um das Problem zu bekommen, ist wie etwas zu verwenden: statt

${dollar}{variable} 

: dann in der Vorlageneingabedatei

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

haben

${variable} 

, die es bereits hatte.

Was dies tut, ist verursachen eine Suche nach ‚Dollar‘ Attribut gegen den Abschnitt unter Verwendung der Schablone und ersetzen sie durch ‚$‘.

Anstatt das zu tun haben, war eine Art der Hoffnung, dass man tun könnte:

\${variable} 

oder vielleicht sogar:

$${variable} 

und eliminiert die Notwendigkeit, ein Dummy-Attribut müssen Trick es zu tun, was ich will.

für buildout auf den Quellcode der Suche entspricht die Art und Weise es Variablensubstitution scheint kein Entkommen Mechanismus zu schaffen. Wenn es tatsächlich keinen Weg gibt, dann kennt vielleicht jemand ein alternatives Templatrezept für Buildout, das eine variable Erweiterung durchführen kann, bietet aber einen Escape-Mechanismus für jede Art von Variablen, so dass man Probleme dort vermeiden kann, wo sie sind ein Konflikt zwischen dem Expansionsmechanismus des Templating-Systems und den literalen Daten in der zu gestaltenden Datei.

Antwort

5

Ich bin Ihre Analyse der buildout Variablensubstitution Code Angst (die collective.recipe.template auf beruht) ist korrekt. Es gibt keine Syntax, um eine ${section:variable} Variablensubstitution zu umgehen, und Ihre Lösung, eine ${dollar} Substitution bereitzustellen, ist die beste Problemumgehung, die ich mir vorstellen kann.

Sie könnten natürlich auch vorschlagen, einen Patch auf das zc.buildout Team, Unterstützung für die Variablensubstitution Syntax zu entkommen. :-)

5

seit Version 1.7 von collective.recipe.template können Sie genshi Textvorlagen verwenden, aber seit Version 1.8 ist es nützlich, da einige Korrekturen vorgenommen wurden.

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

so die Eingabedatei sieht es aus wie

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

genshi ermöglicht des Dollars zu entkommen, sehen http://genshi.edgewall.org/wiki/Documentation/templates.html#escaping

Weitere Details, wie bei http://pypi.python.org/pypi/collective.recipe.template#genshi-text-templates teh Rezept mit genshi verwenden

1

Das Einfügen einer leeren Ersetzung zwischen $ und { sollte verhindern, dass f Auswerten des resultierenden Textes als Buildout-Substitution.

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 
Verwandte Themen