Конфигурации автозагрузки настраиваемой структуры проекта 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
Другие вопросы по тегам