Проблема в том, что в режиме разработки все файлы загружаются с помощью 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
Существует метод большей части этого безумия рельсов.