了解Ruby的负载路径

问题描述:

我有点困惑,为什么我的项目不能加载它需要的文件,这是一个非常简单的项目树:了解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广告路径属于它,而不是有多个红宝石。 –

Ruby的$LOAD_PATH将不包括你的lib目录默认情况下(即使这就是你正在运行的文件所在的位置)。

您可以告诉ruby解释,包括它:

ruby -Ilib lib/processor.rb 

或者你可以在lib文件夹添加到负载路径:在这种情况下

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

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上运行。 –

使用Ruby的require_relative

require_relative "processor/mapper"