Почему в моем пути Ruby нет текущего каталога?
Есть ли какая-то причина, по которой мой нынешний рабочий каталог не находится в моем пути Ruby?
Рассматривать:
~:499$ irb
ruby-1.9.2-p136 :002 > puts $:
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.6.0
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.6.0
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1
/Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/x86_64-darwin10.6.0
=> nil
Это действительно беспокоит меня, потому что require не работает так, как я думал (хотя я - ruby nuby):
require 'some_file_that_I_know_darn_well_is_in_pwd.rb'
Если я добавлю '.'
до конца, то требование работает, как я ожидал.
Что мне не хватает?
ОБНОВИТЬ:
Arg! Теперь у меня новая проблема. Рассматривать:
ruby-1.9.2-p136 :010 > `ls`
=> "start.rb\n"
ruby-1.9.2-p136 :011 > require_relative 'start'
LoadError: cannot infer basepath
from (irb):11:in `require_relative'
from (irb):11
from /Users/mrberryman/.rvm/rubies/ruby-1.9.2-p136/bin/irb:16:in `<main>'
Теперь как дела?
3 ответа
В Ruby 1.9.2 в Powers that Be введено явное изменение, так что рабочий каталог больше не находится в пути Ruby. Я думал, что это был Апокалипсис и ужасная вещь, пока я не узнал о require_relative
, Мои приложения имеют тенденцию выглядеть так:
require 'some_gem'
require 'another_gem'
require_relative 'lib/init'
А потом lib/init.rb
могу иметь:
require_relative 'lib1' # this is lib/lib1.rb
require_relative 'lib2' # this is lib/lib2.rb
Это пчелиные колени, и они решают всевозможные проблемы, которые у меня были, когда требовался один и тот же файл из разных рабочих каталогов.
Редактировать: К сожалению (по причинам, которые я не знаю и не изучал) require_relative
не работает конкретно в IRB. Для этого вы можете:
- делать то, что вы изначально описали: либо
$: << '.'
или же$:.unshift '.'
, или же ты можешь использовать
load 'myfile.rb'
или жеrequire './myfile'
вместо:irb(main):001:0> Dir['*.rb'] => ["a.rb", "bar.rb", "foo.rb", "prime.rb", "tmp.rb"] irb(main):002:0> require 'a' LoadError: no such file to load -- a from <internal:lib/rubygems/custom_require>:29:in `require' from <internal:lib/rubygems/custom_require>:29:in `require' from (irb):2 from /usr/local/bin/irb:12:in `<main>' irb(main):003:0> require_relative 'a' LoadError: cannot infer basepath from (irb):3:in `require_relative' from (irb):3 from /usr/local/bin/irb:12:in `<main>' irb(main):004:0> load 'a.rb' a => true irb(main):005:0> require './a' a => true
Вы можете использовать require_relative, предполагая, что он делает то, что вам нужно.
Убедитесь, что для переменной среды "RUBYLIB" заданы все пути к каталогам, в которых вы найдете пользовательский код *.rb. Это сводило меня с ума тоже.