如何显示 Ruby 应用程序中发生的“要求”的层次结构?
某些文件需要需要附加文件的文件。
但是,通过在调试模式下运行应用程序,您只会触发所需文件的子集 - 仅触发您的应用程序在任何给定时间点使用的任何功能子集使用的文件。
您如何将应用程序中所有需求的综合层次结构显示为树?
如何显示 Ruby 应用程序中发生的“要求”的层次结构?
某些文件需要需要附加文件的文件。
但是,通过在调试模式下运行应用程序,您只会触发所需文件的子集 - 仅触发您的应用程序在任何给定时间点使用的任何功能子集使用的文件。
您如何将应用程序中所有需求的综合层次结构显示为树?
问题是在开发模式下,所有文件都是加载的,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'
ben@legba-2:~ $ ruby check_requires.rb
foo
-bar
baz
祝你好运
编辑:解释
这样做是创建一个全局数组来存储需求的嵌套级别。第一个 puts 输出所需的文件。然后将破折号添加到嵌套级别。然后实际上需要该文件。如果加载的文件调用 require,那么整个过程会重新开始,除了嵌套级别为 1 深,因此 "-#{file}" 是 puts-ed。除非嵌套级别增加,否则此过程会重复,破折号也会重复。加载文件及其所有依赖项后,require 会删除它添加的破折号,以便嵌套级别处于与 require 启动时相同的状态。这使树结构保持准确。
const_missing 类似于 method_missing。基本上,就像当你调用AnObject.some_unknown_method
ruby 时会AnObject.method_missing(:some_unknown_method)
在引发 NoMethodError 之前调用一样,使用 SomeUnknownConstantconst_missing(:SomeUnknownConstant)
在引发 NameError 之前会触发 a。Rails 定义了 const_missing 以便它会在某些指定的路径中搜索可能定义缺失常量的文件。它使用命名约定来促进这一点,例如SomeUnknownConstant
预计在some_unknown_constant.rb
有一种方法可以解决很多这种疯狂的问题。