了解Ruby的加载path
我有点困惑,为什么我的项目无法加载所需的文件,这是一个非常简单的项目树:
processor/ bin/ lib/ processor.rb processor/ mapper.rb reducer.rb
和我的processor.rb
文件看起来像
require 'processor/mapper' require 'processor/reducer' class Processor end
而只是为了testing它的文件映射器看起来像:
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>'
Ruby的$LOAD_PATH
在默认情况下不会包含你的lib
目录(即使这是你正在运行的文件所在的位置)。
你可以告诉ruby
解释器包含它:
ruby -Ilib lib/processor.rb
或者你可以添加lib
文件夹到加载path:
$LOAD_PATH.unshift(File.dirname(__FILE__)) require 'processor/mapper' ...
Ruby 1.9不再包含“。” 在加载path中。 require "#{File.dirname(__FILE__)}/processor/mapper"
或使用require_relative
。
您可以通过检查$LOAD_PATH
(或$:
$LOAD_PATH
来确定当前的加载path
(编辑:$ LOAD_PATH不是$:LOAD_PATH)
在这种情况下使用Ruby的require_relative
:
require_relative "processor/mapper"