了解Ruby的负载路径
问题描述:
我有点困惑,为什么我的项目不能加载它需要的文件,这是一个非常简单的项目树:了解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>'
答
Ruby的$LOAD_PATH
将不包括你的lib
目录默认情况下(即使这就是你正在运行的文件所在的位置)。
您可以告诉ruby
解释,包括它:
ruby -Ilib lib/processor.rb
或者你可以在lib
文件夹添加到负载路径:在这种情况下
$LOAD_PATH.unshift(File.dirname(__FILE__))
require 'processor/mapper'
...
答
Ruby 1.9不再包含“。”。在负载路径中。做require "#{File.dirname(__FILE__)}/processor/mapper"
或使用require_relative
。
您可以随时决定通过检查$LOAD_PATH
(或$:
)电流负载路径
(编辑:$ LOAD_PATH不是$:LOAD_PATH)
+3
他的确切场景实际上不会在1.8中运行(从根处理器文件夹运行'ruby lib/processor.rb')。然而,在'lib'文件夹中运行'ruby processor.rb'可以在1.8上运行,但不能在1.9上运行。 –
答
使用Ruby的require_relative
:
require_relative "processor/mapper"
“Ruby's”有一个撇号,因为您指示的是lo广告路径属于它,而不是有多个红宝石。 –