您如何在 Ruby 应用程序中以树的形式跟踪“require”的完整序列和顺序?

Posted

技术标签:

【中文标题】您如何在 Ruby 应用程序中以树的形式跟踪“require”的完整序列和顺序?【英文标题】:How can you track the full sequence & order of 'require's in a Ruby app as a tree? 【发布时间】:2010-11-04 01:14:54 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

问题在于,在开发模式下,所有文件都使用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 会在引发 NoMethodError 之前调用 AnObject.method_missing(:some_unknown_method),使用 SomeUnknownConstant 在引发 NameError 之前触发 const_missing(:SomeUnknownConstant)。 Rails 定义了 const_missing 以便它会在某些指定的路径中搜索可能定义缺失常量的文件。它使用命名约定来促进这一点,例如SomeUnknownConstant 预计在 some_unknown_constant.rb

有一种方法可以解决这种疯狂的轨道。

【讨论】:

哇。这是一个不错的小脚本。让我看看我能不能弄清楚你在做什么。所以, require_level 是一个空的全局数组。然后将 require 方法别名为 orig_require 并重新定义 require。不确定您的第一个 puts 语句是做什么的。然后在数组中附加一个破折号。然后你需要文件,从数组中弹出最后一个值(为什么要麻烦?它只是一个破折号,对吗?你不能只打印“-”吗?)然后你打印你需要的文件的名称。它似乎有效,我只是不确定它是如何运作的。谢谢你的剧本。我现在要试试这个。 另外,在您的回答中,我不明白您所说的 const_missing 是什么意思。你介意详细说明一下吗? 解释现在在答案中 谢谢,本。这是一个非常简洁的解释,消除了我的困惑。不幸的是,正如我认为您所暗示的那样,这也意味着实际的需求层次结构可能很难理解,除非您的脚本处理的情况有明确的要求。但是,在常量的情况下,由于 const_missing 被覆盖的方式,很难轻松发现所需的内容。至少我是这样解释你的解释的。 肯定的。如果您有一个特别令人不安的案例(例如您只需要更多信息),您可能应该深入研究文件rails/activesupport/lib/active_support/dependencies.rb。根据您的具体需要,您也许可以创造性地添加一些调试工具来找到它。一个完整的 require 层次结构是不会发生的(或者如果发生了,那么它的价值就很可疑)。

以上是关于您如何在 Ruby 应用程序中以树的形式跟踪“require”的完整序列和顺序?的主要内容,如果未能解决你的问题,请参考以下文章

java 如何读取指定文件夹内的所有文件夹及文件,然后在页面上以树的形式显示出来。

如何使用 mixpanel-ruby gem 来跟踪事件?

BurpSuite系列----Spider模块(蜘蛛爬行)

BurpSuite学习第四节--Spider

Ruby 在哪里跟踪其打开的文件描述符?

有没有办法在黑莓中以字符串的形式获取异常的堆栈跟踪?