2011-02-11 13 views
35

क्या कोई कारण है कि मेरी वर्तमान कार्यशील निर्देशिका मेरे रूबी पथ पर नहीं है?मेरे रूबी पथ पर वर्तमान निर्देशिका क्यों नहीं है?

पर विचार करें:

~:499$ irb 
ruby-1.9.2-p136 :002 > puts $: 
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1 
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.6.0 
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby 
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1 
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.6.0 
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby 
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1 
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/x86_64-darwin10.6.0 
=> nil 

यह वास्तव में मुझे परेशान कर रहा है, क्योंकि आवश्यकता नहीं कर रहा है के रूप में मैंने सोचा कि यह होगा (हालांकि मैं एक गहरे लाल रंग का Nuby हूँ):

require 'some_file_that_I_know_darn_well_is_in_pwd.rb' 

अगर मैं '.' संलग्न अंत में, फिर काम की आवश्यकता है जैसा कि मैं उम्मीद करता हूं।

मुझे क्या याद आ रही है?


अद्यतन:

Arg! अब मुझे एक नई समस्या मिल रही है। विचार करें:

ruby-1.9.2-p136 :010 > `ls` 
=> "start.rb\n" 
ruby-1.9.2-p136 :011 > require_relative 'start' 
LoadError: cannot infer basepath 
    from (irb):11:in `require_relative' 
    from (irb):11 
    from /Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/bin/irb:16:in `<main>' 

अब क्या हो रहा है?

उत्तर

74

रूबी में 1.9.2 शक्तियां जो an explicit change पेश की गईं ताकि कामकाजी निर्देशिका अब रूबी पथ में न हो। मैंने सोचा कि यह सर्वनाश और एक भयानक बात थी, जब तक कि मैंने require_relative के बारे में सीखा। मेरे ऐप्स को इस तरह देखने के लिए करते हैं:

require 'some_gem' 
require 'another_gem' 
require_relative 'lib/init' 

और फिर lib/init.rb हो सकता है:

require_relative 'lib1' # this is lib/lib1.rb 
require_relative 'lib2' # this is lib/lib2.rb 

यह मधुमक्खियों घुटनों है, और समस्याओं के सभी प्रकार के हल करती है मैं अलग से एक ही फाइल की आवश्यकता के साथ किया करते थे कामकाजी निर्देशिकाएं

संपादित करें: दुर्भाग्य से (जिन कारणों से मुझे नहीं पता और इन्हें नहीं देखा गया है) require_relative विशेष रूप से irb में काम नहीं करता है। इस आप कर सकते हैं के लिए:

  1. क्या आप शुरू में वर्णित करते हैं: या तो $: << '.' या $:.unshift '.', या
  2. आप load 'myfile.rb' या require './myfile' बजाय का उपयोग कर सकते हैं:

    irb(main):001:0> Dir['*.rb'] 
    => ["a.rb", "bar.rb", "foo.rb", "prime.rb", "tmp.rb"] 
    
    irb(main):002:0> require 'a' 
    LoadError: no such file to load -- a 
        from <internal:lib/rubygems/custom_require>:29:in `require' 
        from <internal:lib/rubygems/custom_require>:29:in `require' 
        from (irb):2 
        from /usr/local/bin/irb:12:in `<main>' 
    
    irb(main):003:0> require_relative 'a' 
    LoadError: cannot infer basepath 
        from (irb):3:in `require_relative' 
        from (irb):3 
        from /usr/local/bin/irb:12:in `<main>' 
    
    irb(main):004:0> load 'a.rb' 
    a 
    => true 
    
    irb(main):005:0> require './a' 
    a 
    => true 
    
+0

तुमने मुझे करीब लाया। अद्यतन प्रश्न पर नजर डालने की देखभाल करें? – JnBrymn

+0

@ जॉनबरीमैन मैच के लिए संपादित किया गया। – Phrogz

+0

अच्छा ... यह समस्या हल हो गई है। जैसा कि मैंने आशा की थी उतनी समाधान के रूप में नहीं।मुझे आश्चर्य है कि यह रूबी लोगों के हिस्से पर कुछ निरीक्षण है। – JnBrymn

1

यकीन है कि वातावरण चर "RUBYLIB" सभी निर्देशिका पथ जहां कस्टम * .rb कोड मिलेगा साथ सेट कर दिया जाता है कि सुनिश्चित करें। यह मुझे पागल भी चला गया।

+1

आवश्यक नहीं है यही कारण है कि। @Phrogz 'जवाब देखें। –

+0

मुझे उस बारे में पता नहीं था। यह एक अच्छा जवाब है (लेकिन मैं इसे कल तक वोट नहीं दे सकता; वोटों से बाहर)। मैं इसे बाहर करने के लिए अपने कुछ कोड को बदलने जा रहा हूं। मेरा तरीका हालांकि काम करता है। मेरे पास कोड है जो अब इस पर निर्भर करता है, लेकिन मुझे अपना रास्ता पसंद है और कोशिश करूँगा। – jmq

3

आप आवश्यकतानुसार यह मानते हैं कि यह आवश्यक है जो आपको चाहिए।

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