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!
>>
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
:
$: << "."
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?
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.
Je viens de rencontrer un problème similaire. Essayer
require './st.rb'
Cela devrait faire l'affaire.
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