理解Ruby';s加载路径

理解Ruby';s加载路径,ruby,Ruby,我有点困惑为什么我的项目不能加载它需要的文件,它是一个非常简单的项目树: processor/ bin/ lib/ processor.rb processor/ mapper.rb reducer.rb 我的processor.rb文件如下所示 require 'processor/mapper' require 'processor/reducer' class Processor end 为了进行测试,文件映射器如下所示: class

我有点困惑为什么我的项目不能加载它需要的文件,它是一个非常简单的项目树:

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>'    
:29:in'require':没有这样的文件要加载——处理器/映射器(LoadError)
from:29:in'require'
从lib/processor.rb:3:in`'
从lib/processor.rb:2:in`'

Ruby 1.9不再在加载路径中包含“.”。是否
require“{File.dirname(\uu File\uuu)}/processor/mapper”
或使用
require\u relative

您始终可以通过检查
$load\u path
(或
$:
)来确定当前加载路径


(编辑:$LOAD\U PATH not$:LOAD\U PATH)

Ruby的
$LOAD\U PATH
默认情况下将不包括您的
lib
目录(即使您正在运行的文件位于该目录)

您可以告诉
ruby
解释器包含它:

ruby -Ilib lib/processor.rb
或者,您可以将
lib
文件夹添加到加载路径:

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

在这种情况下,使用Ruby的
require\u relative

require_relative "processor/mapper"

他的确切场景实际上在1.8中也不起作用(从根
processor
文件夹运行
ruby lib/processor.rb
)。但是,在
lib
文件夹中运行
ruby processor.rb
将适用于1.8,但不适用于1.9。“ruby”有一个撇号,因为您指示的是属于它的加载路径,而不是有多个ruby。