के साथ "निष्पादित" करने के लिए नेस्टेड कॉल करना पाइथन का कपड़ा फ़ंक्शन का उपयोग करके fab
उपयोगिता के बाहर कपड़े फ़ंक्शन को आमंत्रित करने की क्षमता प्रदान करता है। एक प्रासंगिक समस्या उत्पन्न होती है जब execute
फ़ंक्शन किसी अन्य फ़ंक्शन के भीतर लागू किया जाता है जिसे निष्पादित करने के द्वारा बुलाया जाता था। फैब्रिक बाहरी निष्पादन के संदर्भ को खो देता है जब आंतरिक निष्पादन का आह्वान किया जाता है और इसे कभी भी ठीक नहीं करता है। उदाहरण के लिए:पाइथन की फैब्रिक लाइब्रेरी
env.roledefs = {
'webservers': ['web1','web2'],
'load_balancer': ['lb1']
}
@roles('webserver')
def deploy_code():
#ship over tar.gz of code to unpack.
...
execute(remove_webserver_from_load_balancer, sHost=env.host_string)
...
#shutdown webserver, unpack files, and restart web server
...
execute(add_webserver_to_load_balancer, sHost=env.host_string)
@roles('load_balancer')
def remove_webserver_from_load_balancer(sHost=None):
ssh("remove_host %s" % sHost)
execute(deploy_code)
execute
करने के लिए पहली कॉल के बाद, कपड़ा पूरी तरह से उसके संदर्भ खो देता है और host_string='lb1'
बजाय 'web1'
साथ deploy_code
समारोह के भीतर सभी आगे आदेशों निष्पादित करता है। मैं इसे याद रखने के लिए कैसे प्राप्त कर सकता हूं?
मैं इस हैक के साथ आया था, लेकिन मुझे लगता है कि यह भविष्य के रिलीज पर टूट सकता:
with settings(**env):
execute(remove_webserver_from_load_balancer, sHost=env.host_string)
यह प्रभावी रूप से सभी राज्य बचाता है और कॉल के बाद यह पुनर्स्थापित करता है, लेकिन के एक अनपेक्षित उपयोग की तरह लगता है समारोह। फैब्रिक को यह बताने का एक बेहतर तरीका है कि यह एक नेस्टेड निष्पादन में है और राज्य को याद रखने के लिए एक सेटिंग स्टैक या समकक्ष विधि का उपयोग करने के लिए है?
धन्यवाद!
बीटीडब्ल्यू, मैं फैब्रिक 1.3.4 – adowds
का उपयोग कर रहा हूं आप फ़ंक्शन को सीधे कॉल करने के बजाय 'execute() 'कार्यों के अंदर क्यों उपयोग करते हैं? – jfs
@ जेएफएसबीस्टियन मुझे लगता है कि [दस्तावेज़ीकरण] (http://docs.fabfile.org/en/1.3.3/usage/execution.html#execute) आपके प्रश्न का उत्तर देता है: 'फैब्रिक का डिज़ाइन जादुई व्यवहार को छोड़ देता है, इसलिए बस कॉल करना कार्य फ़ंक्शन खाता सजावटकर्ताओं जैसे भूमिकाओं में नहीं लेता है। – jcollado