2009-06-18 26 views
5

如何顯示在Ruby應用程序中發生的'require'的層次結構?如何跟蹤Ruby應用程序中的require作爲樹的完整順序和順序?

某些文件需要需要附加文件的文件。

但是,通過在調試模式下運行應用程序,您只需觸發所需文件的子集 - 只有那些由您的應用程序在任何給定時間點使用的任何子集功能所使用的文件。

如何顯示應用程序中所有需求的綜合層次結構?

回答

9

的問題是,在開發模式下,所有文件都加載load而不是require,使他們能夠在每個請求重新加載。在生產中,他們只裝載一次。除了一些框架類外,大多數文件仍然只在第一次使用時才加載。發生這種情況是因爲ActiveSupport重寫const_missing以自動嘗試從具有適當命名方案的文件加載未知常量(ConstantName.to_s.underscore將給出require 'constant_name')。這當然真的搞糊塗了'需求'層次。

對於簡單的情況,您可以修改以下,以滿足您的一些需求(也檢查出active_support依賴)

$require_level = [] 
    alias :orig_require :require 
    def require(file) 
    puts "#{$require_level.join}#{file}" 
    $require_level << "-" 
    r = orig_require(file) 
    $require_level.pop 
    r 
    end 

    require 'foo' 
    require 'baz' 


[email protected]:~ $ ruby check_requires.rb 
foo 
-bar 
baz 

好運

編輯:解釋

那是什麼確實是創建一個全局數組來存儲需求的嵌套級別。第一個輸出輸出所需的文件。然後將一個短劃線添加到嵌套級別。該文件實際上是必需的。如果加載的文件調用需要,那麼整個過程再次啓動,除了嵌套級別是1深度,所以「 - #{file}」被放置。這個過程會重複,除非嵌套級別增長,破折號也一樣。在加載文件及其所有依賴項後,require會刪除它添加的短劃線,以便嵌套級別與require需要啓動時的狀態相同。這使樹結構保持準確。

const_missing與method_missing類似。基本上,就像當你調用AnObject.some_unknown_method時ruby會在調用NoMethodError之前調用AnObject.method_missing(:some_unknown_method),在引發NameError之前使用SomeUnknownConstant觸發const_missing(:SomeUnknownConstant)。 Rails定義了const_missing,以便它可以搜索某些指定路徑的文件,這些文件可能會定義缺少的常量。它使用命名慣例來促進這一點,例如SomeUnknownConstant預計將在some_unknown_constant.rb

有一種方法,大部分這種軌瘋狂。

+0

哇。這是一個很好的小腳本。讓我看看我能否弄清楚你在做什麼。所以,require_level是一個空的全局數組。然後你將require方法作爲orig_require別名並重新定義require。不確定你的第一次投入聲明是幹什麼的。然後你將一個短劃線添加到數組中。然後你需要文件,從數組中彈出最後一個值(爲什麼打擾?這只是一個破折號,對吧?你不能打印「 - 」?)然後你打印你需要的文件的名稱。它似乎工作,我只是不知道它是如何工作的。感謝您的腳本。我現在要試試這個。 – monkeyman 2009-06-18 16:49:00