2009-12-11 13 views
6

मैं अपने deploy.rbCapistrano: deploy.rb फ़ाइल पुनर्रचना

namespace :app do 
    desc "copies the configuration frile from ~/shared/config/*.yml to ~/config" 
    task :copy_config_files,:roles => :app do 
    run "cp -fv #{deploy_to}/shared/config/hoptoad.rb #{release_path}/config/initializers" 
    run "cp -fv #{deploy_to}/shared/config/app_config.yml #{release_path}/config/app_config.yml" 
    end 
end 

में कोड निम्नलिखित है मैंने सोचा कि यह एक अच्छा विचार होगा मेरी deploy.rb फ़ाइल साफ रखने के लिए और मैं करने के लिए कोड से ऊपर ले जाने का प्रयास किया config के तहत capistrano_utilities.rb। मैं रेल आवेदन का उपयोग कर रहा हूँ। और मैं कोड की पंक्ति

require File.expand_path(File.dirname(__FILE__) + "/../lib/capistrano_utilities") 

deploy.rb को अब मैं निम्न त्रुटि हो रही है निम्नलिखित गयी।

undefined method `namespace' for main:Object (NoMethodError) 

deploy.rb में स्वयं का मान Capistrano :: कॉन्फ़िगरेशन है। जबकि capistrano_utilities में स्वयं का मूल्य मुख्य है। तो मैं समझता हूं कि मुझे नेमस्पेस विधि त्रुटि क्यों मिल रही है। इस समस्या के लिए क्या तय है?

उत्तर

9

अपने config/deploy.rb में, require के बजाय load आज़माएं। इसके अलावा, Capistrano पहले से ही चलाता है के रूप में यदि आप RAILS_ROOT पर हैं, इसलिए __FILE__ उपयोग करने के लिए कोई आवश्यकता नहीं है:

load "lib/capistrano_utilities" 

एक Capistrano कॉन्फ़िग फ़ाइल में, load वर्तमान कॉन्फ़िगरेशन में एक और कॉन्फ़िगरेशन फ़ाइल लोड करने नए सिरे से परिभाषित किया गया है। जब इसे पथ पारित किया जाता है, तो यह वास्तव में load_from_file (कैपिस्ट्रानो द्वारा परिभाषित एक निजी विधि) कहता है जो डिस्क से फ़ाइल और instance_eval पर पढ़ता है।

+2

हालांकि मैं आवश्यकता और लोड के बीच एकमात्र अंतर था कि उनमें से एक फ़ाइल को कई बार स्मृति में दोहराता है और दूसरा एक बार पढ़ता है। क्या आप समझा सकते हैं कि भार क्यों काम करता है और आवश्यकता नहीं है। – Roger

+0

रोजर, कैपिस्ट्रानो के विनिर्देशों के बारे में अधिक जानकारी दी गई। –

+0

धन्यवाद रयान। रूबी पारिस्थितिक तंत्र से एक और अद्भुत जादू। – Roger

0

Rails.root पर अपना कैपफ़ाइल देखें। यदि आप कैपिस्ट्रानो 3 का उपयोग करते हैं, तो आप यह लाइन देखते हैं;

Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

अब, पर "lib/Capistrano/कार्य/capistrano_utilities.cap" आपकी फ़ाइल रखा है और उसे लोड किया जाएगा।

संबंधित मुद्दे