Ruby — создать драгоценный камень: перезагрузить консоль с обновленным содержимым драгоценного камня

Согласно этой статье, мы можем протестировать наш драгоценный камень код, добавив эти строки в наш rakefile:

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

Это работает очень хорошо, за исключением того, что всякий раз, когда в гем вносятся изменения, мне нужно exit и перезапустить rake console, чтобы обновить код. Это действительно не удобно как инструмент создания/отладки...

Есть ли способ написать собственный метод, который действовал бы как классный метод reload! из Rails?

Сценарий bash не будет работать, так как первая команда находится в консоли Ruby, и я бы предпочел 100% решение ruby.

Спасибо!


person Augustin Riedinger    schedule 15.05.2014    source источник


Ответы (1)


Вы можете использовать глобальную переменную $LOADED_FEATURES, чтобы найти компоненты вашего драгоценного камня и повторно загрузить их с помощью команды load (использование require не сработает, так как оно пропускает элементы, которые Ruby уже обработал):

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

Обратите внимание, что это не удастся, если вы пишете собственные расширения, вам придется исключить их, и вам понадобится шаг компиляции и выход / перезапуск в любом случае, если они изменятся.

person Neil Slater    schedule 15.05.2014
comment
Добавлена ​​переменная для получения имени драгоценного камня от my_gem.gemspec: @gemname = Dir["#{Dir.pwd}/*.gemspec"].first.split('/').last.sub('.gemspec', '') - person Augustin Riedinger; 15.05.2014