35 votes

Pourquoi le répertoire courant n'est-il pas dans mon chemin Ruby ?

Y a-t-il une raison pour laquelle mon répertoire de travail actuel ne se trouve pas dans mon chemin Ruby ?

Pensez-y :

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

Cela me dérange vraiment car require ne fonctionne pas comme je le pensais (bien que je sois un ruby nuby) :

require 'some_file_that_I_know_darn_well_is_in_pwd.rb'

Si j'ajoute '.' jusqu'à la fin, alors le besoin fonctionne comme prévu.

Qu'est-ce que je rate ?


UPDATE :

Arg ! Maintenant, j'ai un nouveau problème. Considérez :

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

Qu'est-ce qu'il y a maintenant ?

75voto

Phrogz Points 112337

Dans Ruby 1.9.2, les pouvoirs en place ont introduit un changement explicite afin que le répertoire de travail ne soit plus dans le chemin de Ruby. Je pensais que c'était l'Apocalypse et une chose terrible, jusqu'à ce que j'apprenne l'existence de require_relative . Mes applications ont tendance à ressembler à ceci :

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

Et puis lib/init.rb peut avoir :

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

C'est la solution idéale, et elle résout toutes sortes de problèmes que j'avais auparavant en demandant le même fichier à partir de différents répertoires de travail.

Modifier : Malheureusement (pour des raisons que je ne connais pas et que je n'ai pas examinées). require_relative ne fonctionne pas spécifiquement dans l'irb. Pour cela, vous pouvez :

  1. faire ce que vous avez décrit initialement : soit $: << '.' o $:.unshift '.' ou
  2. vous pouvez utiliser load 'myfile.rb' o require './myfile' à la place :

    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

3voto

Vous pouvez utiliser require_relative en supposant qu'elle fait ce dont vous avez besoin.

1voto

jmq Points 2582

Assurez-vous que la variable d'environnement "RUBYLIB" est définie avec tous les chemins de répertoire où vous trouverez du code *.rb personnalisé. Cela m'a rendu fou aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X