Понимание путей загрузки Ruby - PullRequest
55 голосов
/ 13 июля 2011

Меня немного смущает, почему мой проект не может загрузить нужные ему файлы, это действительно простое дерево проекта:

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

Ответы [ 3 ]

73 голосов
/ 13 июля 2011

Ruby's $LOAD_PATH не будет включать ваш каталог lib по умолчанию (даже если именно там находится файл, который вы запускаете).

Вы можете указать интерпретатору ruby включить его:

ruby -Ilib lib/processor.rb

Или вы можете добавить папку lib в путь загрузки:

$LOAD_PATH.unshift(File.dirname(__FILE__))
require  'processor/mapper'
...
34 голосов
/ 13 июля 2011

Ruby 1.9 больше не включает "." в пути загрузки. Делай require "#{File.dirname(__FILE__)}/processor/mapper" или используй require_relative.

Вы всегда можете определить текущий путь загрузки, проверив $LOAD_PATH (или $:)

(отредактировано: $ LOAD_PATH, а не $: LOAD_PATH)

4 голосов
/ 06 сентября 2016

Используйте Ruby's require_relative в этом случае:

require_relative "processor/mapper"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...