Ruby on rails 如何使用rails 6/Zeitwerk在rails初始值设定项中预加载关注点?
我正在使用一个初始值设定项,该初始值设定项通过在第三方库中包含一些应用关注点来对应用程序进行一些猴子补丁。基本上:Ruby on rails 如何使用rails 6/Zeitwerk在rails初始值设定项中预加载关注点?,ruby-on-rails,ruby,autoload,ruby-on-rails-6,Ruby On Rails,Ruby,Autoload,Ruby On Rails 6,我正在使用一个初始值设定项,该初始值设定项通过在第三方库中包含一些应用关注点来对应用程序进行一些猴子补丁。基本上: # config/initializers/my_initializer.rb class SomeExternalLib include MyConcern1 include MyConcern2 end 这在Rails 5.2.3中运行良好,但在升级到Rails 6时,我收到了以下反对消息: 弃用警告:初始化自动加载常量mycancern1和mycancern2 不
# config/initializers/my_initializer.rb
class SomeExternalLib
include MyConcern1
include MyConcern2
end
这在Rails 5.2.3中运行良好,但在升级到Rails 6时,我收到了以下反对消息:
弃用警告:初始化自动加载常量mycancern1和mycancern2
不赞成这样做。初始化期间自动加载正在进行
在Rails的未来版本中成为错误条件
重新加载不会重新启动应用程序,因此在重新加载过程中执行代码
初始化不会再次运行。例如,如果重新加载ApplicationHelper,
预期的更改不会反映在陈旧的模块对象中
这些自动加载的常量已卸载
请查看“自动加载和重新加载常量”指南以了解解决方案。
(从at/Users/myuser/code/myapp/config/environment.rb:7调用)
我的关注点在app/controllers/concerns/中。经过一些调查,我发现这条路径没有被自动加载,但我不知道如何让Zeitwerk Rails 6的新自动加载程序动态加载这条路径。我尝试按照描述的STI自动加载模式进行操作,但没有成功。您知道如何解决此弃用警告吗?如果我仔细阅读错误消息,会有所帮助: 在Rails的未来版本中,初始化期间自动加载将是一种错误情况 更改的讨论是,指南是 简而言之,自动加载不应该在初始化器中完成,这将被逐步淘汰。解决方案是:1)不使用需要在初始化器中自动加载的内容(显然是首选),或2)在初始化器中明确要求依赖项 因此,我会:
# config/initializers/my_initializer.rb
require 'my_concern1'
require 'my_concern2'
class SomeExternalLib
include MyConcern1
include MyConcern2
end
正如@Glyoko的回答所述,在依赖项上使用
require
可以防止自动加载初始化器。然而,正如@Puhlze在评论中提到的那样,这样做会导致重新加载过程中出现问题
我偶然发现了另一种利用Rails.configuration.to_prepare
的方法
例如:
#config/initializers/my_initializer.rb
Rails.configuration.to_prepare do
类SomeExternalLib
包括霉菌癌1
包括霉菌癌2
结束
结束
请注意,这在开发中的每个请求之前运行,但在生产中加载之前只运行一次
编辑:它似乎也适用于重新加载。使用“require”的问题是,它会中断所需文件中的代码重新加载。不幸的是,似乎没有更好的方法来维护代码的重新加载。很好的发现,从风格上来说,我更喜欢这个。这会保留代码重新加载吗?我的印象是,问题的本质排除了初始化器中的代码重新加载。它似乎与重新加载一起工作-编辑以包括这一点!