2009-07-16 46 views
7

Có cách đơn giản để thoát các ký tự ma thuật được sử dụng để thay thế biến trong cấu hình buildout, sao cho chuỗi bị bỏ lại một mình. Nói cách khác, nơi tôi nói:Ngăn chặn thay thế biến xảy ra với việc xây dựng

[part] 
attribute = ${variable} 

Tôi không thực sự muốn nó để mở rộng $ {} biến nhưng để lại nó như là giá trị văn chương.

Trong thực tế, vấn đề cụ thể mà tôi gặp phải không nằm trong tệp cấu hình xây dựng, mà trong tệp mẫu được xử lý bởi công thức 'collective.recipe.template'. Điều này sử dụng cùng một công cụ thay thế biến từ buildout được sử dụng trong các tập tin cấu hình. Vấn đề là tệp tôi muốn sử dụng làm mẫu đã sử dụng cú pháp '$ {variable}' cho mục đích riêng của mình cùng với hệ thống cấu hình ứng dụng cuối cùng sẽ tiêu thụ tệp.

Cách duy nhất tôi đã tìm thấy để có được xung quanh vấn đề là sử dụng cái gì đó như:

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

Trong tập tin đầu vào mẫu sau đó có:

${dollar}{variable} 

thay vì:

${variable} 

rằng nó đã có.

Điều này đang làm là tìm kiếm thuộc tính 'đô la' so với phần sử dụng mẫu và thay thế bằng '$'.

Thay vì phải làm điều đó, đã loại hy vọng rằng người ta có thể làm:

\${variable} 

hoặc thậm chí:

$${variable} 

và loại bỏ sự cần thiết phải có để có một thuộc tính giả để lừa nó vào làm những gì tôi muốn.

Nhìn vào mã nguồn để xây dựng, cách nó khớp với thay thế biến dường như không cung cấp cơ chế thoát.

Nếu thực sự không có cách nào, thì có lẽ ai đó biết về công thức thay thế khuôn mẫu để xây dựng có thể mở rộng thay đổi, nhưng cung cấp cơ chế thoát cho bất kỳ cách nào nó chỉ ra biến, sao cho có thể tránh được vấn đề xung đột giữa cơ chế mở rộng hệ thống tạo khuôn mẫu và dữ liệu theo nghĩa đen trong tệp đang được tạo mẫu.

Trả lời

5

Tôi sợ phân tích của bạn về mã thay thế xây dựng (mà tập hợp.recipe.template dựa vào) là chính xác. Không có cú pháp nào để thoát khỏi sự thay thế biến số ${section:variable} và giải pháp của bạn về việc cung cấp thay thế ${dollar} là giải pháp thay thế tốt nhất mà tôi có thể nghĩ đến.

Bạn cũng có thể đề xuất bản vá cho nhóm zc.buildout để thêm hỗ trợ cho việc thoát cú pháp thay thế biến. :-)

5

kể từ phiên bản 1.7 của tập thể.recipe.template bạn có thể sử dụng mẫu văn bản genshi, nhưng kể từ phiên bản 1.8, nó hữu ích vì một số bản sửa lỗi được thực hiện.

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

nên input-file nó trông giống như

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

genshi cho phép thoát của đồng đô la, xem http://genshi.edgewall.org/wiki/Documentation/templates.html#escaping

Thông tin chi tiết về cách sử dụng teh recipe với genshi tại http://pypi.python.org/pypi/collective.recipe.template#genshi-text-templates

1

Chèn thay thế trống giữa ${ sẽ ngăn chặn việc xây dựng f rom đánh giá văn bản kết quả là một thay thế xây dựng.

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 
Các vấn đề liên quan