2009-06-18 22 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