2009-01-06 12 views
5

यहां एक और नौसिखिया प्रश्न है:रूबी कैसे जानता है कि एक आवश्यक फ़ाइल कहां मिलें?

require 'tasks/rails' 

मैंने इस पंक्ति को प्रत्येक रेल परियोजना के रूट पथ में रेकैकाइल में देखा। मुझे लगता है कि इस लाइन का उपयोग सभी रेक कार्यों को लोड करने के लिए विक्रेता/रेल/रेल/lib/कार्यों/rails.rb की आवश्यकता के लिए किया जाता है:

$VERBOSE = nil 
# Load Rails rakefile extensions 
Dir["#{File.dirname(__FILE__)}/*.rake"].each { |ext| load ext } 
# Load any custom rakefile extensions 
Dir["#{RAILS_ROOT}/lib/tasks/**/*.rake"].sort.each { |ext| load ext } 
Dir["#{RAILS_ROOT}/vendor/plugins/*/**/tasks/**/*.rake"].sort.each { |ext| load ext } 

मेरा प्रश्न यह है कि केवल 'कार्य/रेल' की आवश्यकता के लिए निर्दिष्ट किया गया है विधि, लेकिन फ़ाइल का पूरा पथ नहीं है?

अग्रिम धन्यवाद।

उत्तर

13

जब आप अपने रेल एप्लिकेशन शुरू यह config/boot.rb जो Rails::Initializer.set_load_path कॉल और $LOAD_PATH अप thatsets चलाता है ।

रूबी require लाइन पर निर्दिष्ट फ़ाइलों को खोजने के लिए निर्देशिकाओं की सूची का उपयोग करता है। यदि आप इसे require '/home/lolindrath/ruby/lib.rb' जैसे एक पूर्ण पथ देते हैं तो यह उस खोज को छोड़ देगा।

यह सी/सी ++ में लगभग #include <stdlib.h> के समान है जहां यह उस हेडर फ़ाइल को खोजने के लिए संकलक को शामिल करने वाले पथ को खोजता है।

+0

[वर्किंग लिंक] (https://github.com/rails/rails/blob/2-3-stable/railties/lib/initializer.rb#L240) रेल 2.3 के 'set_load_path' पर)। (लाइन नंबर बदल सकता है, लेकिन शायद फाइल नहीं होगी।) (मुझे नहीं पता कि रेल 3 उसी कोड को कहां रखता है।) –

1

मेरा मानना ​​है कि क्योंकि आपके पथ अपने /config/environment.rb फ़ाइल में स्थापित कर रहे हैं:

require File.join(File.dirname(__FILE__), 'boot') 
+0

मुझे समझ में नहीं आता, क्या आप कृपया अधिक विशिष्ट हो सकते हैं? – eric2323223

+0

यह वर्तमान में चल रही स्क्रिप्ट का फ़ाइल नाम प्राप्त करता है, यह उस निर्देशिका को प्राप्त करता है जो File.dirname का उपयोग करने में फ़ाइल करता है और उसके बाद एक नई फ़ाइल जोड़ता है (यानी एक फ़ाइल की आवश्यकता होती है जिसे आप जानते हैं उसी निर्देशिका में है लेकिन $ LOAD_PATH में नहीं)। फिर File.join सुरक्षित रूप से नया फ़ाइल नाम बनाता है। – Lolindrath

0

निश्चित रूप से। /config/boot.rb में (environment.rb में कहा जाता है) के रूप में RAILS_ROOT इसलिए की स्थापना की है:

RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT) 

जो तुम जड़ मेरा मानना ​​है कि से बातें की आवश्यकता के लिए अनुमति देता है। उम्मीद है कि वैसे भी जवाब है!

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