了解Ruby的加载路径

我对为什么我的项目无法加载所需的文件感到有些困惑,这是一个非常简单的项目树:

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

我的2618630398573806806592文件看起来像

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>'    
JP Silvashy asked 2019-11-17T19:51:02Z
3个解决方案
73 votes

Ruby的lib默认情况下不会包含您的lib目录(即使您正在运行的文件所在的目录)。

您可以告诉lib解释器包括它:

ruby -Ilib lib/processor.rb

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

$LOAD_PATH.unshift(File.dirname(__FILE__))
require  'processor/mapper'
...
Dylan Markow answered 2019-11-17T19:51:37Z
34 votes

Ruby 1.9不再包含“。” 在加载路径中。 请执行$LOAD_PATH或使用$:

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

(编辑:$ LOAD_PATH而不是$:LOAD_PATH)

cam answered 2019-11-17T19:52:14Z
4 votes

在这种情况下,请使用Ruby的require_relative

require_relative "processor/mapper"
Aldo 'xoen' Giambelluca answered 2019-11-17T19:52:39Z
translate from https://stackoverflow.com:/questions/6671318/understanding-rubys-load-paths