2011-05-30 12 views
9

Gem found in irb, not in Ruby हल करने की कोशिश करते हैं, मैं देख कोशिश की क्या प्रभाव require 'rubygems' मेरी अपनी स्थापना पर था:rubygems की आवश्यकता कैसे rubygem फ़ाइलों को खोजने में मदद करता है?

$ irb 
irb(main):001:0> RUBY_VERSION 
=> "1.8.7" 
irb(main):002:0> $: 
["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/x86_64-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/x86_64-linux", "."] 
=> nil 
irb(main):003:0> require "rubygems" # Hasn't been required already 
=> true 
irb(main):004:0> require "rubygems" # Will return false, because it's already been required 
=> false 
irb(main):005:0> $: # Same as before 
=> ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/x86_64-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/x86_64-linux", "."] 

तो rubygems की आवश्यकता वाले $: संशोधित नहीं करता है, तो यह कैसे मदद करता है फ़ाइलों को ढूंढना? क्या यह require बंदरगाह करता है? यदि हां, तो rubygem- स्थापित पुस्तकालयों को खोजने के लिए यह किस चर का उपयोग करता है?

उत्तर

13

यहां प्रासंगिक स्रोत का वर्तमान संस्करण है: https://github.com/rubygems/rubygems/blob/02ead548e38ff90923444fa7c0ff9f6a5dbd87b0/lib/rubygems/custom_require.rb। (संपादित करें:। here's an earlier version (1.5.2) कि अधिक स्पष्ट रूप से व्यक्त करता है कि क्या होता है)

डॉक्स कहते हैं:

जब RubyGems की आवश्यकता है, Kernel#require हमारे अपने साथ बदल दिया है जो मांग पर जवाहरात लोड हो रहा है में सक्षम है। यह है

  • फ़ाइल मौजूदा रूबी loadpath से लोड किया जा सकता है, तो:

    जब आप require 'x' कहते हैं, तो ऐसा होता है।

  • अन्यथा, इंस्टॉल किए गए रत्नों को मेल खाने वाली फ़ाइल के लिए खोजा जाता है। यदि यह मणि 'वाई' में पाया जाता है, तो यह मणि सक्रिय होता है ( लोडपाथ में जोड़ा गया)।

झूठी लौटने अगर कि फ़ाइल पहले से लोड किया गया है संरक्षित है के सामान्य require कार्यक्षमता।

यह module Kernel खोलने और मूल aliasing alias gem_original_require require साथ की आवश्यकता होती है, तो फिर से परिभाषित करने require पहले मूल संस्करण कहते हैं, और जवाहरात को देखो कि अगर काम नहीं करता है करने के लिए ऐसा करता है।

तो लोड पथ केवल बदल गया है जब आप एक मणि की आवश्यकता होती है:

ruby-1.8.7-p330 :002 > $:.length 
=> 9 
ruby-1.8.7-p330 :003 > require 'rubygems' 
=> true 
ruby-1.8.7-p330 :004 > $:.length 
=> 9 
ruby-1.8.7-p330 :005 > require 'haml' 
=> true 
ruby-1.8.7-p330 :006 > $:.length 
=> 10 
+0

क्या आपको पता है चर इसे इस्तेमाल करता है? –

+1

@Andrew 'Gem.path' जो आप खोज रहे हैं वह हो सकता है। – matt

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