2011-07-12 13 views
51

我有點困惑,爲什麼我的項目不能加載它需要的文件,這是一個非常簡單的項目樹:瞭解Ruby的負載路徑

processor/ 
    bin/ 
    lib/ 
    processor.rb 
    processor/ 
     mapper.rb 
     reducer.rb 

和我processor.rb文件看起來像

require 'processor/mapper' 
require 'processor/reducer' 

class Processor 

end 

而只是爲了測試它是文件映射器看起來像:

class Mapper 
    def run 
    puts "running map" 
    end 
end 

但運行ruby lib/processor.rb結果於:

<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- processor/mapper (LoadError) 
    from <internal:lib/rubygems/custom_require>:29:in `require' 
    from lib/processor.rb:3:in `<class:Processor>' 
    from lib/processor.rb:2:in `<main>'  
+1

「Ruby's」有一個撇號,因爲您指示的是lo廣告路徑屬於它,而不是有多個紅寶石。 –

回答

68

Ruby的$LOAD_PATH將不包括你的lib目錄默認情況下(即使這就是你正在運行的文件所在的位置)。

您可以告訴ruby解釋,包括它:

ruby -Ilib lib/processor.rb 

或者你可以在lib文件夾添加到負載路徑:在這種情況下

$LOAD_PATH.unshift(File.dirname(__FILE__)) 
require 'processor/mapper' 
... 
33

Ruby 1.9不再包含「。」。在負載路徑中。做require "#{File.dirname(__FILE__)}/processor/mapper"或使用require_relative

您可以隨時決定通過檢查$LOAD_PATH(或$:)電流負載路徑

(編輯:$ LOAD_PATH不是$:LOAD_PATH)

+3

他的確切場景實際上不會在1.8中運行(從根處理器文件夾運行'ruby lib/processor.rb')。然而,在'lib'文件夾中運行'ruby processor.rb'可以在1.8上運行,但不能在1.9上運行。 –

4

使用Ruby的require_relative

require_relative "processor/mapper"