Ruby LoadError: невозможно загрузить такой файл
Когда мне нужен файл, например (называемый st.rb):
require 'rubygems'
require 'mongrel'
class TestHandler < Mongrel::HttpHandler
def process(request, response)
response.start(200) do |head, out|
head["Content-Type"] = "text/html"
out.write "Hello, World!\n"
end
end
end
в irb я получаю:
>> require 'st.rb'
LoadError: cannot load such file -- st.rb
from /usr/local/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /usr/local/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from (irb):3
from /usr/local/bin/irb:12:in `<main>'
У меня может быть ключ, но это всего лишь предположение. Моя рубиновая версия/место установки:
/usr/local/bin/ruby
и ruby 1.9.3p0
рубиновые драгоценные камни находятся в /usr/local/lib/ruby/1.9.1
и говорят о версии 1.9.1
. Может быть, это и есть причина?
Спасибо!
UPDATE
Странно, когда я печатаю 'puts RUBY_VERSION' в IRB, я получаю следующее:
puts RUBY_VERSION
1.9.3
NoMethodError: undefined method `write' for nil:NilClass
from /usr/local/lib/ruby/1.9.1/irb.rb:311:in `printf'
from /usr/local/lib/ruby/1.9.1/irb.rb:311:in `output_value'
from /usr/local/lib/ruby/1.9.1/irb.rb:160:in `block (2 levels) in eval_input'
from /usr/local/lib/ruby/1.9.1/irb.rb:273:in `signal_status'
from /usr/local/lib/ruby/1.9.1/irb.rb:156:in `block in eval_input'
from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:243:in `block (2 levels) in each_top_level_statement'
from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `loop'
from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `block in each_top_level_statement'
from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `catch'
from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `each_top_level_statement'
from /usr/local/lib/ruby/1.9.1/irb.rb:155:in `eval_input'
from /usr/local/lib/ruby/1.9.1/irb.rb:70:in `block in start'
from /usr/local/lib/ruby/1.9.1/irb.rb:69:in `catch'
from /usr/local/lib/ruby/1.9.1/irb.rb:69:in `start'
from /usr/local/bin/irb:12:in `<main>'
Maybe IRB bug!
>>
Ответы
Ответ 1
Каталог, в котором st.rb
живет, скорее всего, не находится на вашем пути загрузки.
Предполагая, что st.rb
находится в каталоге с именем lib
относительно того, где вы вызываете irb
, вы можете добавить этот каталог lib
в список каталогов, которые ruby использует для загрузки классов или модулей с помощью этого:
$: << 'lib'
Например, для вызова модуля с именем foobar (foobar.rb), который находится в каталоге lib
, мне нужно будет сначала добавить каталог lib
в список пути загрузки. Здесь я просто добавляю каталог lib
в свой путь загрузки:
irb(main):001:0> require 'foobar'
LoadError: no such file to load -- foobar
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
from (irb):1
irb(main):002:0> $:
=> ["/usr/lib/ruby/gems/1.8/gems/spoon-0.0.1/lib", "/usr/lib/ruby/gems/1.8/gems/interactive_editor-0.0.10/lib", "/usr/lib/ruby/site_ruby/1.8", "/usr/lib/ruby/site_ruby/1.8/i386-cygwin", "/usr/lib/ruby/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i386-cygwin", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i386-cygwin", "."]
irb(main):004:0> $: << 'lib'
=> ["/usr/lib/ruby/gems/1.8/gems/spoon-0.0.1/lib", "/usr/lib/ruby/gems/1.8/gems/interactive_editor-0.0.10/lib", "/usr/lib/ruby/site_ruby/1.8", "/usr/lib/ruby/site_ruby/1.8/i386-cygwin", "/usr/lib/ruby/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i386-cygwin", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i386-cygwin", ".", "lib"]
irb(main):005:0> require 'foobar'
=> true
ИЗМЕНИТЬ
Извините, я полностью упустил тот факт, что вы используете ruby 1.9.x. Все учетные записи сообщают, что ваш текущий текущий рабочий каталог был удален из LOAD_PATH
из соображений безопасности, поэтому вам нужно будет сделать что-то вроде irb
:
$: << "."
Ответ 2
Для безопасности и других причин ruby по умолчанию не включает текущий каталог в load_path. Вы можете проверить это для более подробной информации - Почему Ruby 1.9.2 удаляет "." от LOAD_PATH, и какова альтернатива?
Ответ 3
Проблема будет решена, если вы укажете свой путь.
например.
"require 'st.rb'" → "require". /st.rb '"
Посмотрите, не решена ли ваша проблема или нет.
Ответ 4
Я столкнулся с подобной проблемой. Попробуйте
require './st.rb'
Это должно сделать трюк.
Ответ 5
Я создал свой Gem, но сделал это в каталоге, который не указан в моем пути загрузки:
$ pwd
/Users/myuser/projects
$ gem build my_gem/my_gem.gemspec
Затем я запустил irb
и попытался загрузить Gem:
> require 'my_gem'
LoadError: cannot load such file -- my_gem
Я использовал глобальную переменную $: для проверки пути загрузки и понял, что использую RVM. И у rvm есть определенные каталоги в моем пути загрузки $:
Ни один из этих каталогов не включал мой каталог ~/projects, где я создал пользовательский гем.
Поэтому одним из решений является изменение самого пути загрузки:
$: << "/Users/myuser/projects/my_gem/lib"
Обратите внимание, что каталог lib находится по пути, в котором содержится файл my_gem.rb, который потребуется в irb:
> require 'my_gem'
=> true
Теперь, если вы хотите установить гем в RVM-пути, вам нужно выполнить:
$ gem install my_gem
Но это должно быть в репозитории, например rubygems.org.
$ gem push my_gem-0.0.0.gem
Pushing gem to RubyGems.org...
Successfully registered gem my_gem