Zeitwerk:将自定义命名空间添加到 /public 目录

Zeitwerk: add custom namespace to /public directory

提问人:ntonnelier 提问时间:8/9/2022 最后编辑:ntonnelier 更新时间:8/9/2022 访问量:392

问:

我有一个具有以下结构的应用程序:

- my_app
  - bin
  - config
  - packages
    - pack_name
      - priv
      - public
        - service_one
        - service_two
    - other_pack_name

注意没有应用程序目录,因为我使用的是 packwerk

使用当前配置,我直接使用 和 常量访问服务。现在,我想要实现的是将它们设置为 和 。但这应该只对里面的文件强制执行。/publicServiceOneServiceTwoPackName::ServiceOnePackName::ServiceTwo/public

我怎样才能做到这一点?

这是我目前的配置:

# config/application.rb

module MyApp
  class Application < Rails::Application
    config.load_defaults 6.0

    # packages
    config.paths.add 'packages', glob: '*/{*,*/concerns}', eager_load: true
    ...
  end
end
# config/initializers/zeitwerk.rb

Rails.autoloaders.each do |autoloader|
  autoloader.inflector.inflect(
    "my_wrapper" => "MyWrapper", # ActiveAdmin class
  )

  autoloader.ignore(Rails.root.join('packages/ops/admin'))
end

service_one.rb应如下所示:

module PackName
  class ServiceOne
  end
end

编辑:我知道这将解决问题,但我想避免在文件夹内创建额外的目录/pack_name/public

Ruby-on-rails 命名空间 自动加载 Zeitwerk

评论

0赞 Xavier Noria 8/9/2022
我不熟悉,但 Zeitwerk 允许您为特定根目录定义自定义命名空间,github.com/fxn/zeitwerk#custom-root-namespaces 记录在这里。从理论上讲,这就是您需要的,但我不知道您是否可以挂接到加载器配置进行自定义。packwerk
0赞 ntonnelier 8/9/2022
该示例中的@XavierNoria是一个实际的类,而此处不是。我是否强制需要 pack_name.rb(或文件夹)?或者有办法解决它?ActiveJob::QueueAdaptersPackName
0赞 Xavier Noria 8/9/2022
它也可以是一个模块。唯一的条件是它不可重新加载。在常见情况下,相同的 API 通过在自动加载程序准备就绪之前要求类或模块对象就在那里来强制执行。

答: 暂无答案