Ruby 'require' ошибка: не удается загрузить такой файл
у меня есть один файл, main.rb со следующим содержанием:
require "tokenizer.rb"
токенизатора.файл rb находится в тот же каталог и его содержание:
class Tokenizer
def self.tokenize(string)
return string.split(" ")
end
end
если я попытаюсь запустить main.РБ я получаю следующую ошибку:
C:Documents and Settingsmysrcfolder>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 ответов
просто сделать это:
require_relative 'tokenizer'
если вы поместите это в файл Ruby, который находится в том же каталоге, что и tokenizer.rb
, он будет работать нормально независимо от того, что ваш текущий рабочий каталог (CWD).
объяснение, почему это лучший способ
другие ответы утверждают, что вы должны использовать require './tokenizer'
, но это неправильно ответ, потому что он будет работать, только если вы запустите процесс Ruby в том же каталоге, что tokenizer.rb
в. Довольно много только оснований считать, используя require
как это было бы, если вам нужно поддерживать Ruby 1.8, который не имеет require_relative
.
на require './tokenizer'
ответ может работать для вас сегодня, но она излишне ограничивает способы, которыми вы можете запустить свой код на Ruby. Завтра, если вы хотите переместить свои файлы в другой каталог или просто хотите запустить процесс Ruby из другого каталога, вам придется переосмыслить все эти require
заявления.
используя require
для доступа к файлам это на пути загрузки-прекрасная вещь, и рубиновые драгоценные камни делают это все время. Но вы не должны начинать аргумент require
С .
если вы не делаете что-то особенное и не знаете, что делаете.
когда вы пишете код, который делает предположения о своей среде, вы должны тщательно подумать о том, какие предположения сделать. В этом случае существует до трех различных способов потребовать tokenizer
файл, и каждый делает другой предположение:
-
require_relative 'path/to/tokenizer'
: предполагается, что относительный путь между двумя исходными файлами Ruby останется неизменным. -
require 'path/to/tokenizer'
: предполагается, чтоpath/to/tokenizer
находится внутри одного из каталогов на пути загрузки ($LOAD_PATH
). Это обычно требует дополнительной настройки, так как вам нужно добавить что-то в путь загрузки. -
require './path/to/tokenizer'
: предполагает, что относительный путь от текущего рабочего каталога процесса Ruby доtokenizer.rb
останется тот же.
я думаю, что для большинства людей и большинства ситуаций предположения, сделанные в вариантах № 1 и № 2, с большей вероятностью будут верны с течением времени.
Ruby 1.9 удалил текущий каталог из пути загрузки, и поэтому вам нужно будет сделать относительное требование к этому файлу, как говорит Дэвид Грейсон:
require_relative 'tokenizer'
нет необходимости суффикс он с .rb
, поскольку Руби достаточно умна, чтобы знать, что вы имеете в виду.
require
загружает файл из $LOAD_PATH
. Если вы хотите потребовать файл относительно текущего исполняемого файла, а не из $LOAD_PATH
используйте require_relative
.
Я бы порекомендовал,
load './tokenizer.rb'
учитывая, что вы знаете, что файл находится в том же рабочем каталоге.
Если вы пытаетесь потребовать его относительно файла, вы можете использовать
require_relative 'tokenizer'
надеюсь, это поможет.
еще один хороший маленький метод-включить текущий каталог в ваш путь загрузки с
$:.unshift('.')
вы можете нажать его на массив $: ($LOAD_PATH), но unshift заставит его загрузить текущий рабочий каталог до остальной части пути загрузки.
после добавления текущего каталога в путь загрузки вам не нужно продолжать указывать
require './tokenizer'
а может просто вернуться к использованию
require 'tokenizer'
require_relative 'tokenizer/main'
Это будет работать хорошо, если он находится в каталоге Gem lib, и это токенизатор.rb
проблема в том, что require
Не загружается из текущего каталога. Это то, что я тоже думал, но потом я нашел это нить. Например, я попробовал следующий код:
irb> f = File.new('blabla.rb')
=> #<File:blabla.rb>
irb> f.read
=> "class Tokenizer\n def self.tokenize(string)\n return string.split(
\" \")\n end\nend\n"
irb> require f
LoadError: cannot load such file -- blabla.rb
from D:/dev/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `req
uire'
from D:/dev/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `req
uire'
from (irb):24
from D:/dev/Ruby193/bin/irb:12:in `<main>'
как видно, он прочитал файл ok, но я не мог его потребовать (путь не был распознан). и вот код, который работает:
irb f = File.new('D://blabla.rb')
=> #<File:D://blabla.rb>
irb f.read
=> "class Tokenizer\n def self.tokenize(string)\n return string.split(
\" \")\n end\nend\n"
irb> require f
=> true
как вы можете видеть, если вы укажете полный путь к файлу загружается правильно.
я использовал 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'
Он работал нормально.
первый :
$ sudo gem install colored2
и, вы должны ввести свой пароль
затем :
$ sudo gem update --system
появляются Обновление библиотек RubyGems-обновление Ошибка: при выполнении камень ... (OpenSSL:: SSL:: SSLError) имя хоста "gems.ruby-china.org" не соответствует сертификату сервера
затем:
$ rvm -v
$ rvm get head
последние Какой язык вы хотите использовать?? [Swift / ObjC]
ObjC
вы хотели бы включить демо применение с вашей библиотекой? [ Да / Нет ]
Да
какие тестирования вы будете использовать? [Specta / Kiwi / None ]
нет
вы хотели бы сделать вид тестирования? [ Да / Нет ]
нет
каков ваш префикс класса?
XMG
запуск установки pod в новой библиотеке.
для тех, кто абсолютно уверен, что их относительный путь правильный, моя проблема была в том, что мои файлы не имеют
вы должны дать путь. По крайней мере, вы должны указать путь из текущего каталога. Это точно сработает. ./ filename