在IRB重新加载rubygem

时间:2010-08-11 21:58:30

标签: ruby-on-rails ruby irb

有没有办法在内存中“重新加载”或“刷新”rubygem?因为我正在玩irb,偶尔我喜欢修改我的gem文件,如果我需要相同的gem,它不会更新到内存中并输出“false”。目前我必须退出IRB,重新进入IRB然后再次要求宝石,必须有更好的方法......它是什么?

3 个答案:

答案 0 :(得分:17)

正如其他人所建议的,您可以使用内核#load。但是,不要浪费时间查找和加载每个gem文件,因为所有必需的文件都存储在$“。有了这些知识,这里有一个reload irb命令:

 def reload(require_regex)
  $".grep(/^#{require_regex}/).each {|e| load(e) }
 end

例如,如果您在irb中使用hirb gem,则只需使用以下命令重新加载:

>> reload 'hirb'

如果无论出于何种原因加载不起作用(文件扩展名比require要好),你可以通过首先在$“中删除它的条目来重新要求任何文件。通过这个建议,上面的命令将是:< / p>

 def reload(require_regex)
   $".grep(/^#{require_regex}/).each {|e| $".delete(e) && require(e) }
 end

选择适合您的方式。就个人而言,我使用后者。

答案 1 :(得分:8)

加载'filename.rb'

每次改变一个......

答案 2 :(得分:6)

一种方法是使用Kernel#load。你可以像Kernel#require一样使用它,除了你必须明确包含文件扩展名。但是,它有它的缺点(即使像class Foo < Struct.new(:foo); end那样简单的事情也会失败,因为它不可能改变类的超类),所以我也想知道更好的方法来做到这一点。

在rails中,您可以在脚本/控制台上使用reload!来实现此目的,但我不知道他们使用了什么样的魔法。

This gist看起来很有希望,但我没有测试过它。