如何避免引入rails/all?排除action_mailbox/engine的方法
解决Rails中移除action_mailbox/engine的问题
1. 确认action_mailbox对应的Gem
action_mailbox是Rails官方内置组件,对应的Gem就是actionmailbox,属于Rails默认依赖集合的一部分。
2. 替代rails/all,手动按需加载Rails组件
最稳妥的方式是放弃加载rails/all,在config/application.rb里手动引入你实际需要的Rails模块,跳过action_mailbox:
# 替换原有的 require 'rails/all' require "rails" # 按需加载所需组件,示例如下(根据你的业务调整): require "active_record/railtie" require "action_controller/railtie" require "action_view/railtie" require "action_mailer/railtie" require "active_job/railtie" # require "action_mailbox/engine" # 注释此行,不加载action_mailbox require "action_cable/engine" require "rails/test_unit/railtie"
3. 修复require重写无输出的问题
你之前的重写代码执行时机太晚,错过了rails/all的加载流程。要捕获加载日志,需把重写代码放在config/application.rb的最顶部,早于rails/all的加载:
# config/application.rb 文件最开头 def require(file) puts "#{file} => #{caller.first}" super end require_relative "boot" require "rails/all" # ... 后续应用配置代码
这样就能输出所有require调用的路径,包括action_mailbox的加载触发点。
4. 若必须用rails/all,强制阻止action_mailbox加载
如果不想手动罗列组件,可以在加载rails/all前,通过覆盖require方法跳过action_mailbox相关文件:
# config/application.rb module YourAppName class Application < Rails::Application config.before_configuration do original_require = Kernel.method(:require) Kernel.module_eval do def require(file) # 跳过所有action_mailbox相关的require请求 return if file == "action_mailbox/engine" || file.start_with?("action_mailbox/") original_require.call(file) end end end end end
不过这种方式属于hack手段,推荐优先使用手动加载组件的方案。
内容的提问来源于stack exchange,提问作者Dorian
相关产品推荐
相关产品推荐

