了解Ruby的加载路径

时间:2011-07-12 21:22:59

标签: 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>'    

3 个答案:

答案 0 :(得分:72)

Ruby的$LOAD_PATH默认情况下不会包含您的lib目录(即使这是您运行的文件所在的位置)。

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

ruby -Ilib lib/processor.rb

或者您可以将lib文件夹添加到加载路径:

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

答案 1 :(得分:34)

Ruby 1.9不再包含“。”在加载路径中。请require "#{File.dirname(__FILE__)}/processor/mapper"或使用require_relative

您始终可以通过检查$LOAD_PATH(或$:)确定当前的加载路径

(编辑:$ LOAD_PATH而非$:LOAD_PATH)

答案 2 :(得分:4)

在这种情况下使用Ruby的require_relative

require_relative "processor/mapper"