2014-05-15 21 views
9

Według tego article, możemy przetestować wokół naszego kodu gem dodając te linie do naszego Rakefile:Ruby - tworzenie gem: przeładować konsolę z zawartością uaktualnione gem

task :console do 
    require 'irb' 
    require 'irb/completion' 
    require 'my_gem' # You know what to do. 
    ARGV.clear 
    IRB.start 
end 

to działa naprawdę dobrze, poza tym, że ilekroć zmiana jest dokonywana w klejnocie, muszę exit i ponownie uruchomić rake console, aby uzyskać zaktualizowany kod. To naprawdę nie jest wygodne jako narzędzie do tworzenia/debugowania ...

Czy istnieje sposób na napisanie niestandardowej metody, która działałaby jako niesamowita metoda reload! z Rails?

Skrypt bash nie będzie działał, ponieważ pierwsze polecenie jest w konsoli Ruby, a ja wolałbym mieć rozwiązanie w 100% ruby.

Dzięki!

+1

'load 'whatever_file_that_was_changed.rb'' –

Odpowiedz

10

Można użyć $LOADED_FEATURES globalny znaleźć elementy swojej gem i ponownie załadować je za pomocą polecenia load (używając require nie zadziała, gdyż pomija niepotrzebne Ruby już zrealizowane):

task :console do 
    require 'irb' 
    require 'irb/completion' 
    require 'my_gem' # You know what to do. 

    def reload! 
    # Change 'my_gem' here too: 
    files = $LOADED_FEATURES.select { |feat| feat =~ /\/my_gem\// } 
    files.each { |file| load file } 
    end 

    ARGV.clear 
    IRB.start 
end 

Pamiętaj, że to się nie powiedzie, jeśli piszesz rozszerzenia natywne, musisz je wykluczyć, a będziesz chciał wykonać krok kompilacji i zrezygnować lub zrestartować, jeśli się zmienią.

+0

Piękne dziękuję! –

+0

Dodano zmienną, aby uzyskać nazwę gem od 'my_gem.gemspec':' @gemname = Dir ["# {Dir.pwd}/*. Gemspec"]. First.split ('/'). Last.sub (' .gemspec ',' ') ' –