ruby-on-rails - 如何在 Ruby 应用程序中以树的形式跟踪 'require' 的完整序列和顺序?

标签 ruby-on-rails ruby require autoload

如何显示 Ruby 应用中发生的“需求”层次结构?

一些文件需要一些文件,而这些文件又需要额外的文件。

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

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

最佳答案

问题在于,在开发模式下,所有文件都是使用 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

祝你好运

编辑:解释

它所做的是创建一个全局数组来存储 requires 的嵌套级别。第一个 puts 输出所需的文件。然后将破折号添加到嵌套级别。然后实际上需要该文件。如果加载的文件调用 require,那么整个过程将再次开始,除了嵌套级别是 1 深,所以“-#{file}”是 puts-ed。这个过程会重复,除非嵌套级别增加,破折号也会增加。加载文件及其所有依赖项后,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

有一种方法可以解决这种疯狂的 Rails 问题。

关于ruby-on-rails - 如何在 Ruby 应用程序中以树的形式跟踪 'require' 的完整序列和顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1013507/

相关文章:

ruby-on-rails - Google Calendar API v3 - 更新事件

ruby-on-rails - ruby 中是否有更短的方法来获取两个日期中的较晚日期?

ruby-on-rails - 使用 Arel 或 ActiveRecord 以编程方式组合 INTERSECT 和 UNION 查询

ruby - 开始使用 MacRuby 和 Xcode 4.2

ruby-on-rails - 当项目可以在多个列表中时列出项目顺序(ruby on rails)

html - 使用 capybara 查找表中的特定行

javascript - 在 Node.js 中模拟嵌套模块?

开始 block 中的 perl 'require'

ruby-on-rails - 错误 : parent directory is world writable but not sticky

PHP获取包含/需要当前文件的文件