2012-04-24 13 views
19

C'è un modo per forzare require -ing di un file per la seconda volta?Come richiedere per la seconda volta

Sto scrivendo una libreria che si trova in un percorso per Ruby. Sto modificando il file mentre faccio un semplice test in IRB.

Ogni volta che apporto una modifica al file, desidero ricaricarlo senza terminare la sessione IRB. L'utilizzo di load richiede ogni volta che si digita l'intero percorso del file e ogni volta che si riavvia IRB è necessario digitare tutte le altre impostazioni delle variabili richieste per il test semplice.

Voglio solo qualcosa come require ma che consente il caricamento per la seconda volta. C'è un modo semplice per farlo?

+0

"IRB" è l'unica opzione? Puoi usare "leva"? –

risposta

24

load non richiede (hmm) un percorso completo. Si aspetta un nome file completo con un'estensione.

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

Sapevo della differenza tra avere o meno ".rb", ma in qualche modo non mi rendevo conto del percorso. – sawa

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

Si potrebbe scrivere il proprio e metterlo nella vostra .irbrc:

Nuova Hotness

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 

Minuti-Old e quindi 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 

Per la versione obsoleta, sarebbe necessario renderla più solida se si desidera supportare RubyGems.

Un problema con una di queste soluzioni è che mentre costringerà-ricaricare il file in questione, se che di file a sua volta chiama require sugli altri (come di solito accade con le gemme) quei file non saranno ricaricato.

Lavorare in giro sarebbe davvero brutto. Ad esempio, potrebbe raggiungere manualmente l'array $LOADED_FEATURES e strappare tutti i percorsi che sembravano essere correlati al nome della gemma. shudder

+0

Ho modificato la risposta per includere una versione più semplice sfruttando la magia esistente esistente. – Phrogz

+0

Grazie per l'aiuto. In realtà, la mia domanda potrebbe essere stata stupida. Come risponde Steenslag, potrei non dovermi preoccupare del percorso, dopotutto. Ma il tuo codice sarà utile. – sawa

Problemi correlati