了解Ruby的加载路径

JP *_*shy 55 ruby

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

processor/
  bin/
  lib/
    processor.rb
    processor/
      mapper.rb
      reducer.rb
Run Code Online (Sandbox Code Playgroud)

我的processor.rb文件看起来像

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

class Processor

end
Run Code Online (Sandbox Code Playgroud)

只是为了测试文件映射器看起来像:

class Mapper
  def run
    puts "running map"
  end
end
Run Code Online (Sandbox Code Playgroud)

但运行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>'    
Run Code Online (Sandbox Code Playgroud)

Dyl*_*kow 74

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

您可以告诉ruby口译员包含它:

ruby -Ilib lib/processor.rb
Run Code Online (Sandbox Code Playgroud)

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

$LOAD_PATH.unshift(File.dirname(__FILE__))
require  'processor/mapper'
...
Run Code Online (Sandbox Code Playgroud)


cam*_*cam 34

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

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

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

  • 他的确切场景实际上也不适用于1.8(从根`processor`文件夹运行`ruby lib/processor.rb`).但是,在`lib`文件夹中运行`ruby processor.rb`可以在1.8上运行,但不能在1.9上运行. (3认同)

Ald*_*uca 5

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

require_relative "processor/mapper"
Run Code Online (Sandbox Code Playgroud)