2010-08-11 61 views
19

有沒有辦法在內存中「重新加載」或「刷新」rubygem?當我在irb中玩時,偶爾我喜歡修改我的gem文件,如果我需要相同的gem,它不會更新到內存中並且輸出「false」。目前,我必須退出IRB,回到IRB,然後再次需要寶石,必須有更好的方式......這是什麼?在IRB中重新加載rubygem

+0

如果我要在哪裏去編碼這個功能? RubyGems的?該社區是否普遍接受新的功能拉取請求? – Schneems 2010-08-13 17:44:40

回答

17

正如其他人所建議的那樣,您可以使用Kernel#load。但是,不要浪費你的時間找到並加載每個寶石文件作爲這方面的知識已被要求保存在$」的所有文件,這裏有一個重載IRB命令:

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

例如,如果您用在IRB的hirb寶石,你只需重新加載有:

>> reload 'hirb' 

如果因任何原因負載不工作(它是關於文件的擴展名不是要求是挑剔),你可以再要求任何文件先在$中刪除它的條目。有了這個建議,上面的命令是:

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

選擇適合你的工作。我個人使用後者。

+0

這對於包含在文件系統中的腳本是否也適用?它不適用於我的...和我的require語句如下所示:'require'#{File.expand_path(__ FILE __)} /../ lib/query'' – picardo 2011-01-08 02:57:05

+2

它不,不。正則表達式太嚴格了 - 您必須指定完整路徑。我修改了我的版本,用^替換^。 – Trejkaz 2013-05-10 02:04:04

8

負載「filename.rb」

一次一個爲每個被改變......

6

的一種方法是使用Kernel#load。你可以像使用Kernel#require一樣使用它,除了你必須明確包含文件擴展名。然而,它有它的缺點(甚至像class Foo < Struct.new(:foo); end那樣簡單的失敗,因爲它不可能改變類的超類),所以我也想知道更好的方法來做到這一點。

在rails中,你可以通過腳本/控制檯上的reload!來實現,但我不知道他們使用了什麼樣的魔法。

This gist看起來很有前途,但我還沒有測試過它。

+0

'reload!'只應該加載'app /'目錄中的東西,僅此而已。這也是有限制的,這就是爲什麼很多類和控制器在開發環境中顯示爲匿名類的原因,所以它們可以在每個請求中完全處理並重新初始化。 – tadman 2010-08-12 01:15:37