Understanding Ruby's load paths

ghz 1years ago ⋅ 9110 views

Question

I'm a little confused about why my project can't load the files it needs, it's a really simple project tree:

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

and my processor.rb file looks like

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

class Processor

end

And just for testing it that file mapper looks like:

class Mapper
  def run
    puts "running map"
  end
end

But running ruby lib/processor.rb results in:

<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>'    

Answer

Ruby's $LOAD_PATH will not include your lib directory by default (even though that's where the file you're running is located).

You can either tell the ruby interpreter to include it:

ruby -Ilib lib/processor.rb

Or you can add the lib folder to the load path:

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