Перезагрузить рубины в ирб? - PullRequest
9 голосов
/ 27 апреля 2011

У меня есть этот скрипт прямо сейчас.

def r(this)
  require this
  puts "#{this} is now loaded."
rescue LoadError
  puts "The gem '#{this}' is missing."
  puts "Should I install it? [y/n]"
  data = gets
  if data =~ /yes|y/i
    puts "Installing #{this}, hold on."
    if `gem install #{this}` =~ /Successfully/i
      load this
    end
  else
    puts "Okey, goodbye."
  end
end

Это позволяет требовать библиотеки на лету. Как это: r "haml".

Проблема в том, что я не могу загрузить гем после его установки. Использование load this или load File.expand_path("~/.irbrc") не работает.

Вот пример.

>> r "absolutize"
The gem 'absolutize' is missing.
Should I install it? [y/n]
y
Installing absolutize, hold on
LoadError: no such file to load -- absolutize
>> require "absolutize"
LoadError: no such file to load -- absolutize
>> exit
$ irb
>> require "absolutize"
=> true

Есть ли способ перезагрузить rubygems или irb на лету?

Ответы [ 3 ]

9 голосов
/ 27 апреля 2011

Я не пробовал, но я думаю, что вы можете искать Gem.clear_paths

Сброс значений dir и path. При следующем запросе dir или path значения будут рассчитаны с нуля. Это в основном используется модульными тестами для обеспечения изоляции теста.

3 голосов
/ 27 апреля 2011

Вы можете сбросить IRB, позвонив exec('irb')

0 голосов
/ 27 апреля 2011

Просто удалите файл из ´ $ "´:

require 'erb' # Loaded.
require 'erb' # Does nothing.
$".delete_if {|e| e =~ /erb\.(?:rb|so)/} # Remove "erb" from loaded libraies.
require 'erb' # Reloaded (with warnings if the first require was successful).

См. http://www.zenspider.com/Languages/Ruby/QuickRef.html#19

...