2011-04-27 18 views
8

Tengo este script ahora mismo.¿Volver a cargar rubygems en irb?

def r(this) 
    require this 
    puts "#{this} is now loaded." 
rescue LoadError 
    puts "The gem '#{this}' is missing." 
    puts "Should I install it? [y/n]" 
    data = gets 
    if data =~ /yes|y/i 
    puts "Installing #{this}, hold on." 
    if `gem install #{this}` =~ /Successfully/i 
     load this 
    end 
    else 
    puts "Okey, goodbye." 
    end 
end 

Eso hace que sea posible requerir libs sobre la marcha. Me gusta esto: r "haml".

El problema es que no puedo cargar la gema después de que se ha instalado. El uso de load this o load File.expand_path("~/.irbrc") no funciona.

Aquí hay un ejemplo.

>> r "absolutize" 
The gem 'absolutize' is missing. 
Should I install it? [y/n] 
y 
Installing absolutize, hold on 
LoadError: no such file to load -- absolutize 
>> require "absolutize" 
LoadError: no such file to load -- absolutize 
>> exit 
$ irb 
>> require "absolutize" 
=> true 

¿Hay alguna manera de volver a cargar rubygems o irb sobre la marcha?

+0

Esta pregunta fue respondida antes http://stackoverflow.com/questions/3463182/reload-rubygem-in-irb/3465637#3465637 – cldwalker

+0

ya he intentado usar esa solución y no funcionó. – Oleander

Respuesta

9

No he intentado, pero creo que podría estar buscando para Gem.clear_paths

Restablezca los valores de ruta y ruta. ime dir o ruta solicitada, los valores se calcularán desde cero. Esto es utilizado principalmente por las pruebas unitarias para proporcionar aislamiento de prueba.

+0

Gracias. [Aquí] (https://gist.github.com/948109) es la versión final del script anterior. – Oleander

3

Puede restablecer IRB llamando exec('irb')

+0

He usado 'exec" irb -r # {this} "' antes. El problema es que "descargará" todas mis gemas. Entonces si yo por ejemplo hice esto. 'requiere" al azar "; r "something" 'then' random' no se cargará después de instalar 'something'. – Oleander

+0

[Esta respuesta] (http://stackoverflow.com/questions/3463182/reload-rubygem-in-irb/3465637#3465637) podría tener lo que está buscando en ese momento. – Mario

0

Basta con retirar el archivo de "$" ':

require 'erb' # Loaded. 
require 'erb' # Does nothing. 
$".delete_if {|e| e =~ /erb\.(?:rb|so)/} # Remove "erb" from loaded libraies. 
require 'erb' # Reloaded (with warnings if the first require was successful). 

Ver http://www.zenspider.com/Languages/Ruby/QuickRef.html#19

Cuestiones relacionadas