如何跟踪完整序列&在Ruby应用程序中作为树的'require'的顺序?
-
06-07-2019 - |
题
如何显示在Ruby应用程序中发生的'require'的层次结构?
某些文件需要需要其他文件的文件。
但是,通过在调试模式下运行应用程序,您只需触发所需文件的子集 - 只有您的应用程序在任何给定时间点使用的任何功能子集所使用的文件。
如何在应用程序中以树形式显示所有需求的综合层次结构?
解决方案
问题是在开发模式下,所有文件都使用 load
而不是 require
加载,以便可以在每个请求上重新加载它们。在生产中,它们只加载一次。除了一些框架类之外,大多数文件仍然只在首次使用时才加载。发生这种情况是因为ActiveSupport重写const_missing以自动尝试使用适当的命名方案从文件加载未知常量( ConstantName.to_s.underscore
将提供 require'constant_name'
)。这当然真的混淆了'require'等级。
对于一个简单的案例,您可以修改以下内容以满足您的一些需求(同时检查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'
ben@legba-2:~ $ ruby check_requires.rb
foo
-bar
baz
祝你好运
编辑:解释
这样做是创建一个全局数组来存储需求的嵌套级别。第一个输出所需的文件。然后将破折号添加到嵌套级别。然后实际需要该文件。如果加载的文件调用require,则整个过程再次开始,除了嵌套级别为1深,因此“ - #{file}”被提出。除了嵌套级别增长之外,此过程重复,破折号也是如此。在加载文件及其所有依赖项之后,require将取消它添加的破折号,以便嵌套级别处于require需要启动时的状态。这使树结构保持准确。
const_missing类似于method_missing。基本上,就像调用 AnObject.some_unknown_method
时一样,ruby会在引发NoMethodError之前调用 AnObject.method_missing(:some_unknown_method)
,使用SomeUnknownConstant触发 const_missing(:SomeUnknownConstant) )
之前提出一个NameError。 Rails定义了const_missing,以便它可以在某些指定的路径中搜索可能定义缺失常量的文件。它使用命名约定来促进这一点,例如: SomeUnknownConstant
应该在 some_unknown_constant.rb
有一种方法可以让这种铁路疯狂。