2010-08-11 18 views
19

¿Hay alguna manera de "recargar" o "actualizar" un rubygem en la memoria? Como juego en IRB, ocasionalmente me gusta modificar mis archivos de gemas, y si requiero la misma gema, no se actualiza en la memoria y da la salida "falsa". Actualmente tengo que salir de IRB, volver al IRB y luego volver a necesitar la gema, tiene que haber una mejor manera ... ¿qué es?Recargar rubygem en IRB

+0

si tuviera que codificar esta funcionalidad en donde debería ir? Rubygems? ¿Esa comunidad generalmente está aceptando nuevas solicitudes de extracción de características? – Schneems

Respuesta

17

Como han sugerido otros, puede usar Kernel # load. . Sin embargo, no pierda su tiempo para encontrar y cargar cada archivo joya ya que todos los archivos que han sido requeridos se almacenan en $" Armado con este conocimiento, aquí hay un comando IRB recarga:

def reload(require_regex) 
    $".grep(/^#{require_regex}/).each {|e| load(e) } 
end 

Por ejemplo, si estaban usando la gema hirb en IRB, sólo tendría que recargar con:

>> reload 'hirb' 

Si por cualquier razón la carga no funciona (es más selectivos acerca de las extensiones de archivo que necesita es), puede volver a requerir por cualquier archivo primero borrando su entrada en $ ". Con este consejo, el comando anterior sería:

def reload(require_regex) 
    $".grep(/^#{require_regex}/).each {|e| $".delete(e) && require(e) } 
end 

Elija lo que funcione para usted. Personalmente, uso el último.

+0

¿Esto también funciona para scripts incluidos en el sistema de archivos? No funcionó para la mía ... y mi declaración require se ve así: 'require' # {File.expand_path (__ FILE __)} /../ lib/query "' – picardo

+2

No, no. La expresión regular es demasiado restrictiva: debe especificar la ruta completa. Modifiqué mi versión, reemplazando^con /. – Trejkaz

8

carga 'filename.rb'

uno a la vez para cada uno que se ha cambiado ...

6

Una forma es utilizar Kernel#load. Puede usarlo prácticamente como Kernel#require, excepto que debe incluir explícitamente la extensión del archivo. Sin embargo, tiene sus inconvenientes (incluso algo tan simple como class Foo < Struct.new(:foo); end falla, ya que no es posible cambiar la superclase de una clase), así que también me gustaría saber una mejor manera de hacerlo.

En rieles puedes lograr esto con reload! en script/consola, pero no sé qué tipo de magia usan.

This gist parece prometedor pero no lo he probado.

+0

'reload!' Solo se supone que carga cosas en el directorio 'app /', nada más. También hay limitaciones en esto, por lo que muchas de sus clases y controladores aparecen como clases anónimas en su entorno de desarrollo, por lo que se pueden eliminar por completo y reiniciarse en cada solicitud. – tadman