2012-04-24 18 views
19

¿Hay alguna manera de forzar require -ing de un archivo por segunda vez?Cómo solicitar por segunda vez

Estoy escribiendo una biblioteca que se encuentra en una ruta para Ruby. Estoy editando el archivo mientras hago una prueba simple en IRB.

Cada vez que realizo un cambio en el archivo, deseo volver a cargarlo sin finalizar la sesión de IRB. Usar load requiere escribir la ruta completa al archivo cada vez, y reiniciar el IRB cada vez requiere que escriba todas las otras configuraciones de variables requeridas para la prueba simple.

Solo quiero algo como require pero eso permite cargar por segunda vez. ¿Hay una manera simple de hacerlo?

+0

¿Es 'IRB' su única opción? ¿Puedes usar 'pry'? –

Respuesta

24

load no requiere (hmm) una ruta completa. Espera un nombre de archivo completo con una extensión.

p load 'date.rb' #=> true 
p load 'date.rb' #=> true 
p load 'date' #=> LoadError 
+0

Conocía la diferencia entre tener o no ".rb", pero de alguna manera no me di cuenta de la ruta. – sawa

4
:000> path = "extremely/long/path/to/my/file" 
:001> load path 
:002> load path 
4

Se puede escribir su propio y lo puso en su .irbrc:

Nueva Picor

module Kernel 
    def reload(lib) 
    if old = $LOADED_FEATURES.find{|path| path=~/#{Regexp.escape lib}(\.rb)?\z/ } 
     load old 
    else 
     require lib 
    end 
    end 
end 

Minutos de edad por Busted

module Kernel 
    # Untested 
    def reload(lib) 
    if File.exist?(lib) 
     load lib 
    else 
     lib = "#{lib}.rb" unless File.extname(lib)=='.rb' 
     $:.each do |dir| 
     path = File.join(dir,lib) 
     return load(path) if File.exist?(path) 
     end 
    end 
    end 
end 

Para la versión antigua y obsoleta, tendría que hacerlo más robusto si deseara dar soporte a RubyGems.

Un problema con cualquiera de estas soluciones es que mientras que obligará a-volver a cargar el archivo en cuestión, si que archivo a su vez llama require en otros (como suele ser el caso con las gemas) esos archivos no serán recargado.

Trabajar alrededor de esto sería realmente feo. Como, tal vez llegar manualmente a la matriz $LOADED_FEATURES y arrancar todas las rutas que parecían estar relacionadas con el nombre de la gema. estremecimiento

+0

He editado la respuesta para incluir una versión más simple aprovechando la magia de requerir existente. – Phrogz

+0

Gracias por la ayuda. En realidad, mi pregunta pudo haber sido estúpida. Como responde Steenslag, no debería haberme preocupado por el camino después de todo. Pero tu código será útil. – sawa

Cuestiones relacionadas