web-dev-qa-db-fra.com

ruby LoadError: impossible de charger un tel fichier

Quand j'ai besoin d'un fichier, par exemple (appelé 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

en irb je reçois:

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

J'aurais peut-être un indice, mais ce n'est qu'une supposition. Ma version/emplacement d'installation de Ruby est:

/usr/local/bin/Ruby et Ruby 1.9.3p0

pourtant, Ruby gems est dans /usr/local/lib/Ruby/1.9.1 et parle de la version 1.9.1. Cela pourrait-il être la raison?

Merci!

UPDATE Bizarre, quand je tape 'met Ruby_VERSION' dans IRB, je comprends ceci:

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!
>> 
22
0xSina

Le répertoire où habite st.rb ne figure probablement pas sur votre chemin de chargement.

En supposant que st.rb se trouve dans un répertoire appelé lib par rapport à l'endroit où vous appelez irb, vous pouvez ajouter ce répertoire lib à la liste des répertoires que Ruby utilise pour charger des classes ou des modules avec ceci:

$: << 'lib'

Par exemple, pour appeler le module appelé 'foobar' (foobar.rb) qui réside dans le répertoire lib, il faudrait d'abord ajouter le répertoire lib à la liste des chemins de chargement. Ici, j'ajoute simplement le répertoire lib à mon chemin de chargement:

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

EDIT Désolé, j'ai complètement manqué le fait que vous utilisiez Ruby 1.9.x. Tous les comptes indiquent que votre répertoire de travail current a été supprimé de LOAD_PATH pour des raisons de sécurité , vous devrez donc procéder de la manière suivante dans irb:

$: << "."
18
buruzaemon

Pour des raisons de sécurité et autres, Ruby n'inclut pas par défaut le répertoire en cours dans le chemin load_path. Vous voudrez peut-être vérifier cela pour plus de détails - Pourquoi Ruby 1.9.2 supprime-t-il "." de LOAD_PATH, et quelle est l'alternative?

11
Dhruva Sagar

Le problème sera résolu si vous spécifiez votre chemin.

par exemple.

"require 'st.rb'" -> "require './st.rb'"

Voyez si votre problème est résolu ou non.

9
Tom K. C. Chiu

Je viens de rencontrer un problème similaire. Essayer

require './st.rb'

Cela devrait faire l'affaire.

1
Faisal Hassan

J'ai créé mon propre joyau, mais je l'ai fait dans un répertoire qui n'est pas dans mon chemin de chargement:

$ pwd
/Users/myuser/projects
$ gem build my_gem/my_gem.gemspec

Puis j'ai lancé irb et essayé de charger la gemme:

> require 'my_gem'
LoadError: cannot load such file -- my_gem

J'ai utilisé la variable globale $: pour inspecter mon chemin de chargement et j'ai compris que j'utilisais RVM. Et rvm a des répertoires spécifiques dans mon chemin de chargement $:. Aucun de ces répertoires n'incluait mon répertoire ~/projects où j'ai créé le bijou personnalisé.

Donc, une solution consiste à modifier le chemin de chargement lui-même:

$: << "/Users/myuser/projects/my_gem/lib"

Notez que le répertoire lib est dans le chemin, qui contient le fichier my_gem.rb qui sera requis dans irb:

> require 'my_gem'
 => true 

Maintenant, si vous voulez installer la gemme dans le chemin RVM, vous devez alors exécuter:

$ gem install my_gem

Mais il faudra que ce soit dans un référentiel comme rubygems.org.

$ gem Push my_gem-0.0.0.gem
Pushing gem to RubyGems.org...
Successfully registered gem my_gem
0
Donato