2009-07-16 13 views
7

के साथ होने वाले परिवर्तनीय प्रतिस्थापन को रोकना buildout कॉन्फ़िगरेशन में परिवर्तनीय प्रतिस्थापन के लिए उपयोग किए गए जादू वर्णों से बचने का एक आसान तरीका है, जैसे स्ट्रिंग अकेली रहती है।बिल्डआउट

[part] 
attribute = ${variable} 

मैं नहीं है वास्तव में यह $ {चर} विस्तार करने के लिए, लेकिन वस्तुतः मान के रूप में छोड़ हैं: दूसरे शब्दों में, मैं कहाँ का कहना है।

प्रैक्टिस में मैं जिस विशिष्ट समस्या का सामना कर रहा हूं वह बिल्डआउट कॉन्फ़िगरेशन फ़ाइल में नहीं है, लेकिन नुस्खा 'collective.recipe.template' द्वारा संसाधित टेम्पलेट फ़ाइल में है। यह बिल्डआउट से समान वैरिएबल प्रतिस्थापन इंजन का उपयोग करता है जो कॉन्फ़िगरेशन फ़ाइलों में उपयोग किया जाता है। समस्या यह है कि जिस फ़ाइल को मैं टेम्पलेट के रूप में उपयोग करना चाहता हूं वह पहले से ही 'कॉन्फ़िगरेशन सिस्टम' के साथ संयोजन के रूप में अपने स्वयं के उद्देश्यों के लिए '$ {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} 

और समाप्त करने के लिए एक डमी विशेषता है करने के लिए की जरूरत जो मैं चाहता हूं उसे करने में इसे चालित करें।

बिल्डआउट के लिए स्रोत कोड को देखते हुए, जिस तरह से यह परिवर्तनीय प्रतिस्थापन से मेल खाता है, वह एक बचने की तंत्र प्रदान नहीं करता है।

यदि वास्तव में कोई रास्ता नहीं है, तो शायद कोई बिल्डआउट के लिए वैकल्पिक टेम्पलेटिंग रेसिपी के बारे में जानता है जो परिवर्तनीय विस्तार कर सकता है, लेकिन यह किसी भी तरह से वेरिएबल्स को इंगित करता है, जिससे कोई समस्या हो सकती है, जिससे कोई समस्या हो सकती है जहां हो सकता है टेम्पलेटिंग सिस्टम विस्तार तंत्र और फ़ाइल में शाब्दिक डेटा टेम्पलेट के बीच एक संघर्ष।

उत्तर

5

मुझे बिल्डआउट वेरिएबल प्रतिस्थापन कोड (जो collective.recipe.template पर निर्भर करता है) के आपके विश्लेषण से डर है। ${section:variable} परिवर्तनीय प्रतिस्थापन से बचने के लिए कोई वाक्यविन्यास नहीं है और ${dollar} प्रतिस्थापन प्रदान करने का आपका समाधान सबसे अच्छा कामकाज है जिसे मैं सोच सकता हूं।

आप निश्चित रूप से वेरिएबल प्रतिस्थापन वाक्यविन्यास से बचने के लिए समर्थन जोड़ने के लिए zc.buildout टीम को पैच का प्रस्ताव भी दे सकते हैं। :-)

5

collective.recipe.template के संस्करण 1.7 के बाद से आप genshi टेक्स्ट टेम्पलेट्स का उपयोग कर सकते हैं, लेकिन संस्करण 1.8 के बाद से कुछ सुधारों के कारण यह उपयोगी है।

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

तो इनपुट फ़ाइल यह लग रहा है Genshi

तरह
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

1
पर Genshi साथ तेह नुस्खा का उपयोग करने का विवरण देखने के

$ और { के बीच एक खाली प्रतिस्थापन डालने से बिल्डआउट एफ को रोका जाना चाहिए रोम बिल्डिंग प्रतिस्थापन के रूप में परिणामस्वरूप पाठ का मूल्यांकन करता है।

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 
संबंधित मुद्दे