Roy*_*lak 3 ruby-on-rails zeitwerk
在从 Classic 迁移到 Zeitwerk 时遇到一些问题。
启用 zeitwerk 并运行后rails s,一切似乎都正常。然后,在保存 .rb 文件并刷新后,我在尝试从顶层请求文件时看到“未初始化常量”错误/lib。
重新加载时有些配置错误,但我正在绞尽脑汁试图弄清楚细节。我的印象是拥有一个顶级/lib文件夹很好,并且使用require在该目录中加载文件与 Zeitwerk 兼容,但现在我不太确定......关于我出错的想法?
注意:我目前没有设置任何特定eager_load_paths或autoload_paths
编辑:按照@Xavier的建议更新日志输出
Zeitwerk@rails.main: module CustomModule autovivified from directory *********/app/workers/custom_module
Zeitwerk@rails.main: autoload set for CustomModule::Profiler, to be loaded from *********/app/workers/custom_module/profiler.rb
Zeitwerk@rails.main: autoload set for CustomModule::AnotherProfiler, to be loaded from *********/app/workers/custom_module/another_profiler.rb
NameError - uninitialized constant CustomModule::AttributeParser
Did you mean? NameParserConstants:
app/models/user.rb:180:in `first_name'
app/middleware/catch_json_parse_errors.rb:8:in `call'
app/middleware/decompress_requests.rb:22:in `call'
Run Code Online (Sandbox Code Playgroud)
命名空间CustomModule在项目中可重新加载的部分(在 下app)以及不可重新加载的部分(在 下lib)中共享。
这个不错,支持。你只需要刻意考虑加载优先级,因为如果lib定义了CustomModule::Foo并且Rails认为CustomModule是可重新加载的,则在重新加载时没有人会CustomModule::Foo再次加载,并且require是幂等的,因此CustomModule::Foo将不再被发现。
解决方案是确保lib 定义了名称空间,并且 Rails 自动加载器重新打开它。与此处记录的基本相同。例如,这可以通过require在初始化程序中发出 a 来加载名称空间来完成。lib
这样,当自动加载器扫描文件系统时,它就知道它不负责管理CustomModule. 它会下降。如果存在子常量,则一切都会照常工作,并且这些常量将被重新加载,但名称空间本身不会。
| 归档时间: |
|
| 查看次数: |
1989 次 |
| 最近记录: |