0

我有一个标准应用程序,其中包含我们将慢慢迁移到单独的 gem 中的子应用程序。主要问题是每个子应用程序基本上具有几乎相同的架构和非常相似的业务逻辑,有时实际上几乎相同。

目前,作为第一步,我们创建了一个子文件夹,lib/client其结构类似于典型的 Rails 应用程序。

例如,对 a 的关注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而不将其包装在模块中?
4

1 回答 1

1

您可以在 zeitwerk中使用Loader#ignore. 您可以通过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
于 2020-06-26T13:16:53.630 回答