2012-05-13 34 views
6

मान लीजिए कि हम दो संसाधन हैं करते हैं:ब्लॉक तरीकों (महाराज संसाधन) नहीं दिख रहा है

template 'template1' do 
    owner 'root' 
    group 'root' 
end 

template 'template2' do 
    owner 'root' 
    group 'root' 
end 

मैं संसाधनों के अंदर कोड का पुन: उपयोग करना चाहते हैं। हालांकि, अगर मैं नुस्खा में एक proc परिभाषित करता हूं, तो आपको owner, group आदि के लिए NoMethodError मिलता है। ऐसा क्यों होता है? लेक्सिकल गुंजाइश अलग नहीं है, है ना? नतीजतन मुझे self.instance_eval &common_cfg का उपयोग करना होगा।

common_cfg = Proc.new { 
    owner 'root' 
    group 'root' 
} 

template 'template1' do 
    common_cfg.call 
end 

template 'template2' do 
    common_cfg.call 
end 
+0

है अगर आप इसे एक वैश्विक ('$ common_cfg') बनाने त्रुटि होती है? –

+0

प्रो वैरिएबल का मूल्यांकन ठीक है, क्योंकि NoMethodError proc (मालिक, समूह इत्यादि) के संदर्भ में होता है – m33lky

+0

ओह; गेटचा - टिप्पणी हटा देंगे। –

उत्तर

2
क्योंकि कैसे महाराज कार्यान्वित किया जाता है (प्रतिबिंब के बहुत सारे के साथ) की

आप किसी लाइब्रेरी या गहरे लाल रंग का ब्लॉक संसाधन में यह डाल करने के लिए बचाने के लिए की जरूरत है। मुझे लगता है कि एक रूबी ब्लॉक संसाधन काम करेगा क्योंकि यह गुंजाइश के बाहर होगा।

http://wiki.opscode.com/display/chef/Libraries

आमतौर पर इस कारण के लिए मुहावरा

["file_one","file_two"].each do |file| 
    template file do 
    owner "root" 
    group "root" 
    end 
end 
+0

दूसरा लिंक टूटा हुआ है। – Eye

+0

@Eye हटा दिया गया क्योंकि यह अब प्रासंगिक नहीं है – EnabrenTane