Как можно отследить полную последовательность и порядок 'require's в приложении Ruby как дерево?

Использовать базовое имя в php

Возвращает завершающий компонент имени пути


7
задан monkeyman 18 June 2009 в 15:52
поделиться

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

Удачи

EDIT: Explanation

Это создает глобальный массив для хранения уровня вложенности требований. Первый put выводит требуемый файл. Затем к уровню вложенности добавляется прочерк. Тогда действительно требуется файл. Если загруженный файл требует, то весь этот процесс запускается заново, за исключением того, что уровень вложенности равен 1, поэтому вставляется "- # {file}". Этот процесс повторяется, за исключением того, что уровень вложенности растет, так же как и тире. После того, как файл и все его зависимости загружены, require снимает добавленную черту, так что уровень вложенности находится в том же состоянии, что и при запуске require. Это обеспечивает точность древовидной структуры.

const_missing аналогичен method_missing. По сути, как и при вызове AnObject.some_unknown_method ruby ​​вызовет AnObject.method_missing (: some_unknown_method) перед вызовом NoMethodError использование SomeUnknownConstant запускает const_missing (: SomeUnknownConstant) перед тем, как вызвать NameError. Rails определяет const_missing таким образом, что он будет искать по определенным указанным путям файлы, которые могут определять отсутствующую константу. Для облегчения этого используется соглашение об именах, например, SomeUnknownConstant , как ожидается, будет в some_unknown_constant.rb

Существует метод большей части этого безумия рельсов.

11
ответ дан 6 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: