2010-01-24 185 views
3

我正在開發一個包含在我的rails應用程序中的ruby模塊。我希望它在更改時自動重新加載。我做了大量的搜索,並且看到了討論它的各種問題,但它們都顯得過時或錯誤。自動重新加載rails模塊

如何在外部模塊更換時在軌中重新加載?我嘗試將其名稱添加到ActiveSupport::Dependencies.unloadable_constants,但是在控制檯中鍵入reload!後,即使我做了另一個require 'foo_module',我也無法再引用NameError: uninitialized constant foo這個符號。有誰知道如何得到這個工作?

注意:這裏是one possible dup,但在註釋中註明'答案',它從來沒有解決過模塊的問題。還有this question,在答案中有一個死鏈接,最後是this one,這也不能解決它。

+0

爲什麼當它改變而不是重新啓動應用程序時重新加載部分應用程序代碼?什麼是用例? – tfwright 2010-01-25 02:37:09

+0

好點。這僅用於測試 - 重新啓動服務器需要很長時間。在生產中這不適用。 – Peter 2010-01-25 03:09:41

回答

4

我發現如何做到這一點:

  1. 確保FooModulelib/foo_module.rb
  2. 使用require_dependency要求您在lib/foo_module.rb的外部庫。

這些步驟都是必需的,不需要其他人。

1

這裏有兩個獨立的問題。

其中更簡單的是您使用require,當你想load

  • require將評估在一個文件中的代碼一次,無論多少次被要求的文件/模塊。

  • load將在每次加載文件時評估文件中的代碼。

require優選負荷分別使用,以便這些文件不被評估多次當許多文件依賴於它們。

簡短版本是可以使用load重新加載已由require加載的模塊。


更復雜的問題是在更改時自動重新加載模塊。

問題中列出的可能重複項之一鏈接到here。如果加載後發生了更改,則表示依賴於您的模塊的任何代碼的前綴都會加上模塊的條件加載。您需要使用全局變量來跟蹤文件何時加載。

N.B .:這不應該在生產服務器上使用,但在開發服務器或控制檯上應該沒問題。