2011-02-11 8 views
35

Czy istnieje jakiś powód, dla którego mój obecny katalog roboczy nie znajduje się na mojej ścieżce Ruby?Dlaczego nie jest obecny katalog na mojej ścieżce Ruby?

Rozważmy:

~: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 

to naprawdę przeszkadza mi to, bo wymaga nie działa, jak myślałem, że będzie (chociaż jestem Nûby rubinowy):

require 'some_file_that_I_know_darn_well_is_in_pwd.rb' 

Gdybym dołączyć '.' do końca, to wymaganie działa tak jak się spodziewam.

Czego mi brakuje?


UPDATE:

Arg! Teraz dostaję nowy problem. Rozważ:

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

Co się dzieje?

Odpowiedz

74

W Rubim 1.9.2 uprawnienia, które zostaną wprowadzone an explicit change, aby katalog roboczy nie znajdował się już na ścieżce Ruby. Myślałem, że to była Apokalipsa i straszna rzecz, dopóki nie dowiedziałem się o require_relative. Moje aplikacje wydają się wyglądać tak:

require 'some_gem' 
require 'another_gem' 
require_relative 'lib/init' 

A potem lib/init.rb może mieć:

require_relative 'lib1' # this is lib/lib1.rb 
require_relative 'lib2' # this is lib/lib2.rb 

To pszczoły kolana i rozwiązuje wszystkie rodzaje problemów Kiedyś miałem z wymagając tego samego pliku z różnych działające katalogi.

Edycja: Niestety (z przyczyn, o których nie wiem i nie zaglądałem) require_relative nie działa specjalnie w irb. W tym celu można:

  1. robić to, co początkowo opisany: albo $: << '.' lub $:.unshift '.' lub
  2. można użyć load 'myfile.rb' lub require './myfile' zamiast:

    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 
    
+0

Przywiodłeś mnie bliżej. Chcesz przejrzeć zaktualizowane pytanie? – JnBrymn

+0

@JohnBerryman Edytowane w celu dopasowania. – Phrogz

+0

Cóż ... to rozwiązało problem. Nie takie ładne rozwiązanie, na jakie miałem nadzieję.Zastanawiam się, czy jest to pewne niedopatrzenie ze strony osób z Ruby. – JnBrymn

1

Upewnij się, że zmienna środowiskowa "RUBYLIB" jest ustawiona we wszystkich ścieżkach katalogów, w których znajdziesz niestandardowy * .rb kod. To też doprowadziło mnie do szału.

+1

to nie jest konieczne. Zobacz odpowiedź @Phrogz. –

+0

Nie wiedziałem o tym. To wspaniała odpowiedź (ale nie mogę głosować na nią do jutra, z głosowania). Zamierzam zmienić część mojego kodu, aby wypróbować to. Moja droga jednak działa. Mam kod, który na nim polega teraz, ale lubię jego sposób i spróbuję tego. – jmq

3

Możesz użyć require_relative zakładając, że robi to, czego potrzebujesz.

Powiązane problemy