Ошибка Ruby 'require': невозможно загрузить такой файл - PullRequest
164 голосов
/ 17 марта 2012

У меня есть один файл main.rb со следующим содержимым:

require "tokenizer.rb"

Файл tokenizer.rb находится в том же каталоге , и его содержимое:

class Tokenizer
    def self.tokenize(string)
        return string.split(" ")
    end
end

Если я пытаюсь запустить main.rb, я получаю следующую ошибку:

C:\Documents and Settings\my\src\folder>ruby main.rb

C:/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- tokenizer.rb (LoadError)
        from C:/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require '
        from main.rb:1:in `<main>'

Я только что заметил, что если я использую load вместо require, все работает нормально.В чем может быть проблема?

Ответы [ 13 ]

180 голосов
/ 17 марта 2012

Я только что попробовал, и он работает с require "./tokenizer". Надеюсь, это поможет.

166 голосов
/ 17 марта 2012

Просто сделайте это:

require_relative 'tokenizer'

Если вы поместите это в файл Ruby, который находится в том же каталоге, что и tokenizer.rb, он будет работать нормально, независимо от того, какой у вас текущий рабочий каталог (CWD)..

Объяснение того, почему это лучший способ

В других ответах утверждается, что вы должны использовать require './tokenizer', но это неправильный ответ, потому что он будет работать толькоесли вы запускаете ваш Ruby-процесс в том же каталоге, в котором находится tokenizer.rb. Практически единственная причина, по которой стоит использовать require, - это если вам нужна поддержка Ruby 1.8, в которой нет require_relative.

Ответ require './tokenizer' может работать для вас сегодня, но он излишне ограничивает способы запуска кода на Ruby.Завтра, если вы хотите переместить ваши файлы в другой каталог или просто хотите запустить процесс Ruby из другого каталога, вам придется переосмыслить все эти операторы require.

Использование require получить доступ к файлам, находящимся на пути загрузки, - хорошая вещь, и гемы Ruby делают это постоянно.Но вы не должны начинать аргумент с require с ., если вы не делаете что-то особенное и не знаете, что делаете.

Когда вы пишете код, который делает предположения относительно его среды, вы должнытщательно продумайте, какие предположения сделать.В этом случае существует три различных способа требовать файл tokenizer, и каждый из них предполагает разные предположения:

  1. require_relative 'path/to/tokenizer': Предполагается, что относительный путь между двумя исходными файлами Rubyостанется прежним.
  2. require 'path/to/tokenizer': Предполагается, что path/to/tokenizer находится в одном из каталогов на пути загрузки ($LOAD_PATH).Как правило, для этого требуется дополнительная настройка, поскольку вам необходимо что-то добавить к пути загрузки.
  3. require './path/to/tokenizer': Предполагается, что относительный путь от текущего рабочего каталога процесса Ruby к tokenizer.rb останется прежним.

Я думаю, что для большинства людей и большинства ситуаций предположения, сделанные в вариантах № 1 и № 2, с большей вероятностью сохранятся со временем.

86 голосов
/ 17 марта 2012

Ruby 1.9 удалил текущий каталог из пути загрузки, поэтому вам потребуется выполнить относительные требования для этого файла, как говорит Дэвид Грейсон:

require_relative 'tokenizer'

Нет необходимости добавлять суффикс к .rb, поскольку Руби достаточно умен, чтобы понять, что ты имеешь в виду в любом случае.

37 голосов
/ 17 марта 2012

require загружает файл из $LOAD_PATH. Если вы хотите запросить файл относительно текущего исполняемого файла вместо $LOAD_PATH, используйте require_relative.

14 голосов
/ 17 марта 2012

Я бы порекомендовал,

load './tokenizer.rb'

Учитывая, что вы знаете, что файл находится в том же рабочем каталоге.

Если вы пытаетесь запросить его относительно файла, вы можете использовать

require_relative 'tokenizer'

Надеюсь, это поможет.

11 голосов
/ 12 августа 2012

Еще один приятный маленький метод - включить текущий каталог в путь загрузки с помощью

$:.unshift('.')

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

После добавления текущего каталога в путь загрузки вам не нужно указывать

 require './tokenizer' 

и можете просто вернуться к использованию

require 'tokenizer'
2 голосов
/ 22 августа 2013

Это будет хорошо работать, если он находится в каталоге gem lib и это tokenizer.rb

require_relative 'tokenizer/main'
1 голос
/ 10 сентября 2013

Я использовал jruby-1.7.4 для компиляции моего кода ruby.

require 'roman-numerals.rb' 

- код, выдавший приведенную ниже ошибку.

LoadError: no such file to load -- roman-numerals
  require at org/jruby/RubyKernel.java:1054
  require at /Users/amanoharan/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:36
   (root) at /Users/amanoharan/Documents/Aptana Studio 3 Workspace/RubyApplication/RubyApplication1/Ruby2.rb:2

Я удалил rb из require и дал

require 'roman-numerals' 

Работало нормально.

0 голосов
/ 08 февраля 2018

Как насчет включения текущего каталога в путь поиска?

ruby -I. main.rb
0 голосов
/ 03 ноября 2017

Первое:

$ sudo gem install colored2

И, вы должны ввести свой пароль

Затем:

$ sudo gem update --system  

Появление Обновление rubygems-update ОШИБКА: Во время выполнения gem ... (OpenSSL :: SSL :: SSLError) имя хоста "gems.ruby-china.org" не соответствует сертификату сервера

Тогда:

$  rvm -v
$ rvm get head

Last На каком языке вы хотите использоватьиспользовать ??[Swift / ObjC]

ObjC

Хотите ли вы включить демонстрационное приложение в свою библиотеку?[Да / Нет]

Да

Какие рамки тестирования вы будете использовать?[Specta / Kiwi / None]

Нет

Хотите провести тестирование на основе просмотра?[Да / Нет]

Нет

Какой у вас префикс класса?

XMG

Запускpod install в вашей новой библиотеке.

...