Подтвердить что ты не робот

Почему текущий каталог на моем пути 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 

Это действительно беспокоит меня, потому что требование не работает, поскольку я думал, что это (хотя я рубиновый nuby):

require 'some_file_that_I_know_darn_well_is_in_pwd.rb'

Если я добавлю '.' до конца, тогда запрос будет работать так, как я ожидал.

Что мне не хватает?


UPDATE:

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

Теперь что?

4b9b3361

Ответ 1

В Ruby 1.9.2 Powers, которые будут введены явное изменение, чтобы рабочий каталог больше не находился в пути 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
    

Ответ 2

Вы можете использовать require_relative, полагая, что он делает то, что вам нужно.

Ответ 3

Убедитесь, что переменная окружения "RUBYLIB" установлена ​​со всеми путями каталогов, где вы найдете свой код *.rb. Это тоже загнало меня в орехи.