2011-02-11 83 views
35

有什麼理由爲什麼我的工作目錄不在我的Ruby路徑上?爲什麼我的Ruby路徑上沒有當前目錄?

考慮:

~: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' 

如果我追加'.'到最後,然後這個需求就像我期望的那樣工作。

我缺少什麼?


UPDATE:

精氨酸!現在我遇到了一個新問題。考慮:

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

在Ruby 1.9.2中引入的權力an explicit change以便工作目錄不再位於Ruby路徑中。我認爲這是啓示錄和一個可怕的事情,直到我瞭解到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 
    
1

確保環境變量「RUBYLIB」在所有目錄路徑中設置,您將在其中找到自定義* .rb代碼。它也讓我瘋狂。

+1

這是沒有必要的。參見@Phrogz的答案。 – 2011-02-11 05:55:52

+0

我不知道那一個。這是一個很好的答案(但我不能在明天之前投票,不能投票)。我要改變一些我的代碼來嘗試一個。我的方式確實有效。我現在有代碼依賴它,但我喜歡他的方式,並會嘗試。 – jmq 2011-02-11 06:05:46

3

您可以使用require_relative,假設它滿足您的需求。

相關問題