Конфигурации автозагрузки настраиваемой структуры проекта Rails
У меня есть стандартное приложение, которое содержит подпрограммы, которые мы постепенно перенесем в отдельные жемчужины. Основная проблема заключается в том, что каждое суб-приложение в основном имеет почти идентичную схему и очень похожую бизнес-логику, которая иногда действительно почти одинакова.
В настоящее время в качестве первого шага мы создали подпапку в lib/client
со структурой, похожей на типичное приложение для рельсов.
Например, беспокойство по поводу ClientA
выглядит так /
module Client
module ClientA
module Concerns
module MyConcern
...
end
end
end
Все это отлично работает и автоматически загружается Zeitwerk.
Однако, когда я хочу создать инициализатор способом Rails, я не хочу оборачивать его внутри модулей и создавать вокруг него класс, и именно здесь я получаю lib/clients/ClientA/config/initializers/custom_initializer.rb to define constant Clients::ClientA::Config::Initializers::CustomInitializer, but didn't (Zeitwerk::NameError)
Эта папка загружается автоматически вот так
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += %W(#{config.root}/lib/client/**/*)
Есть ли способ как
- Добавить папку в черный список из-под автозагрузки Zeitwerk?
- Загрузите его, используя
require
или каким-либо другим способом без упаковки в модули?
1 ответ
Вы можете игнорировать части проекта в zeitwerk используяLoader#ignore
. Вы можете получить доступ к автозагрузчику rails zeitwerk черезRails.autoloaders.main
.
Итак, вы сможете добавить что-то подобное в свой application.rb
:
Rails.autoloaders.main.ignore(Rails.root.join('lib/clients/*/config/initializers/*.rb'))
Затем вам придется потребовать их вручную, возможно, в инициализаторе в главном каталоге приложения. Вы могли бы создатьconfig/initializers/clients.rb
с чем-то вроде:
Dir[Rails.root.join('lib/clients/*/config/initializers/*.rb')].each do |filename|
require filename
end