Перезагрузить rubygems в irb?

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

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 на лету?


person Linus Oleander    schedule 27.04.2011    source источник
comment
На этот вопрос был дан ответ до stackoverflow.com/questions/3463182 /reload-rubygem-in-irb/   -  person cldwalker    schedule 28.04.2011
comment
Я уже пробовал использовать это решение, и оно не сработало.   -  person Linus Oleander    schedule 29.04.2011


Ответы (3)



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

person Mario    schedule 27.04.2011
comment
Я использовал exec "irb -r #{this}" раньше. Проблема в том, что он выгрузит все мои драгоценные камни. Вот если бы я например сделал так. require "random"; r "something", то random не будет загружаться после установки something. - person Linus Oleander; 27.04.2011
comment
В этом ответе может быть то, что вы ищете. - person Mario; 27.04.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

person Guilherme Bernal    schedule 27.04.2011