如何跟踪Ruby应用程序中作为树的'require'的完整顺序和顺序?

mon*_*man 7 ruby ruby-on-rails require autoload

如何显示在Ruby应用程序中发生的'require'的层次结构?

某些文件需要需要其他文件的文件.

但是,通过在调试模式下运行应用程序,您只会触发所需文件的子集 - 只有您的应用程序在任何给定时间点使用的任何功能子集所使用的文件.

如何在应用程序中显示树的所有需求的综合层次结构?

Ben*_*hes 11

问题是在开发模式下,所有文件都被加载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
Run Code Online (Sandbox Code Playgroud)

祝好运

编辑:解释

这样做是创建一个全局数组来存储需求的嵌套级别.第一个输出所需的文件.然后将破折号添加到嵌套级别.然后实际需要该文件.如果加载的文件调用require,则整个过程再次启动,除了嵌套级别为1深,因此" - {{file}"被放置.除了嵌套级别增长之外,此过程重复,破折号也是如此.在加载文件及其所有依赖项之后,require将取消它添加的破折号,以便嵌套级别处于require需要启动时的状态.这使树结构保持准确.

const_missing类似于method_missing.基本上,就像调用AnObject.some_unknown_methodruby时会AnObject.method_missing(:some_unknown_method)在引发NoMethodError之前调用一样,const_missing(:SomeUnknownConstant)在引发NameError之前使用SomeUnknownConstant触发a .Rails定义了const_missing,以便它可以在某些指定的路径中搜索可能定义缺失常量的文件.它使用命名约定来促进这一点,例如SomeUnknownConstant预期在其中some_unknown_constant.rb

有一种方法可以解决这个轨道疯狂的问题.