【问题标题】:How can I extend gem class in Rails 6/Zeitwerk without breaking code reloading?如何在 Rails 6/Zeitwerk 中扩展 gem 类而不破坏代码重新加载?
【发布时间】:2023-04-05 12:41:02
【问题描述】:

当我使用 rails 6 / zeitwerk 时,如何扩展 gem 定义的类?

我已经尝试在初始化程序中使用require 来首先加载类。 我尝试在初始化程序中执行此操作,并仅引用该类以让自动加载首先加载它。

但这两种方法都破坏了开发模式下的自动重新加载。

我尝试将其放入lib/app/,但这不起作用,因为这样就永远不会从 gem 加载该类,因为我的新文件在加载顺序中更高。

有一个类似的问题here,但该问题专门询问如何在初始化程序中执行此操作。我不在乎它是否在初始化程序中完成,我只是想弄清楚如何以某种方式做到这一点。

做这种事情的标准方法是什么?

我确实有一个讨厌的 hack 似乎在起作用,但我不喜欢它(更新:这也不起作用。重新加载仍然失败):

the_gem_root = $LOAD_PATH.grep(/the_gem/).grep(/models/).first
require("#{the_gem_root}/the_gem/some_model")

class SomeModel

    def my_extension
        ...
    end

end

【问题讨论】:

  • 这里为什么需要 require 呢?我希望您的 gem 在 application.rb 中加载 bundler.require。还有你的文件现在在哪里?
  • 我是开发模式,我猜gem不是eager加载的吧?因此,当我尝试重新打开课程时,如果没有要求,我最终会定义一个新课程。我已经在 config/initializer.rb 和 app/models 中尝试了我的覆盖,但没有成功。
  • 这似乎不是 Zeitwerk 的问题。 Zeitwerk 不会自动加载 Afaik 宝石。除非您有一些自定义设置,否则它们通常仍会在 application.rb 中加载 Bundler.require(*Rails.groups)。您可以发布您的 Gemfile 的相关部分吗?我想知道您的宝石是否不在开发组中。顺便说一句,这是哪颗宝石?
  • 这是来自 Gemfile 的行(它是邮箱 gem)。它没有安装在任何特定组内。 gem 'mailboxer', git: 'https://github.com/booleanbetrayal/mailboxer.git', branch: 'update_attributes-update'我在application.rbBundler.require(:default, Rails.env)有这条线

标签: ruby-on-rails zeitwerk


【解决方案1】:

我知道迟到了,但这真的很痛苦,有人会觉得它很有帮助,在这个例子中,我将使用位于应用程序上的模块文件夹,其中包含用于各种 gem 的自定义模块和猴子补丁。

# config/application.rb
...
module MyApp
  class Application < Rails::Application
    config.load_defaults(6.0)

    overrides = "#{Rails.root}/app/modules"

    Rails.autoloaders.main.ignore(overrides)

    config.to_prepare do
      Dir.glob("#{overrides}/**/*.rb").each do |override|
        load override
      end
    end
  end
end

显然这种模式被称为覆盖模式,它会阻止 zeitwerk 自动加载您的覆盖,并且每个文件都会在加载结束时手动加载。

【讨论】:

  • 这需要被接受为正确答案。 Zeitwerk 在开发和生产中处理自动加载路径的方式不同,我一直在努力寻找解决方案。由于到目前为止的惯例似乎是在 ${Rails.root}/lib/core_extensions 中保留对 ruby​​ 核心库的扩展,因此我相应地修改了上述内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
相关资源
最近更新 更多