Предотвращение замены переменных с помощью buildout - PullRequest
8 голосов
/ 16 июля 2009

Существует ли простой способ экранирования магических символов, используемых для подстановки переменных в конфигурации buildout , такой, что строка остается одна. Другими словами, где я говорю:

[part]
attribute = ${variable}

На самом деле я не хочу, чтобы он расширял $ {variable}, но оставлял его как буквальное значение.

На практике конкретная проблема, с которой я сталкиваюсь, заключается не в самом файле конфигурации компоновки, а в файле шаблона, обработанном рецептом "коллективной. 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}

и избавьте от необходимости иметь фиктивный атрибут, чтобы заставить его делать то, что я хочу.

Глядя на исходный код для компоновки, то, как он соответствует подстановке переменных, похоже, не обеспечивает механизм перехода.

Если пути действительно нет, то, возможно, кто-то знает альтернативный рецептурный шаблон для компоновки, который может выполнять расширение переменных, но предоставляет механизм перехода для любого способа, которым он указывает переменные, так что можно избежать проблем, когда могут возникнуть конфликт между механизмом расширения шаблонных систем и литеральными данными в шаблонируемом файле.

Ответы [ 3 ]

6 голосов
/ 22 июля 2009

Я боюсь, что ваш анализ кода подстановки переменных buildout (на который ссылается коллектив.recipe.template) правилен. Не существует синтаксиса для экранирования ${section:variable} подстановки переменных, и ваше решение предоставить подстановку ${dollar} - лучший обходной путь, который я могу придумать.

Конечно, вы также можете предложить патч команде zc.buildout, чтобы добавить поддержку для исключения синтаксиса подстановки переменных. : -)

5 голосов
/ 09 мая 2011

, начиная с версии 1.7 коллективного. Recipe.template, вы можете использовать текстовые шаблоны genshi, но, начиная с версии 1.8, это полезно из-за некоторых исправлений.

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

так что входной файл выглядит как

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

Генси позволяет убежать от доллара, см. http://genshi.edgewall.org/wiki/Documentation/templates.html#escaping

Подробнее о том, как использовать рецепт с генси в http://pypi.python.org/pypi/collective.recipe.template#genshi-text-templates

2 голосов
/ 07 мая 2016

Вставка пустой подстановки между $ и { должна помешать компоновке оценивать полученный текст как подстановку компоновки.

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
...