如何解决升级到Rails 6时,有一种编程方式可以检测Zeitwerk :: NameError?
我目前正在将旧的Rails应用程序迁移到Rails 6。
项目中的某些文件似乎与其中定义的类不一致。 在运行应用程序的测试时,我没有看到此错误,但是在部署之后,我收到如下错误:
Zeitwerk::NameError: expected file /app/my?_/app/lib/multi_io.rb to define constant MultiIo,but didn't
在先前的SO问题中,我可以找到以下建议:
- Rails 6: Zeitwerk::NameError doesn't load class from module设置
config.autoloader = :classic
- How to ignore a folder in Zeitwerk for Rails 6?忽略给定路径
- Autoloading and Zeitwerk Mode in Rails 6调整
config.autoload_path
我不是在寻找解决方法,因此我更正了引发异常的文件。
我想找到一种编程方式来检测所有不一致的路径/类名称,而无需在生产模式下运行应用程序。
到目前为止,我想到了三个选择:
- 一项瑞克任务,用于验证自动加载(not provided by the gem)。是否存在?您可以在开发环境中从Rails控制台运行一个代码段吗?
- rubocop cop或其他静态代码分析器。有吗?
- 在测试环境中强制执行紧急负载
在不需要多次迭代/部署的情况下,验证我的代码的建议方法是什么?
非常感谢您
解决方法
您可以使用zeitwerk::check
任务检查项目的自动加载兼容性:
$ bin/rails zeitwerk:check
Hold on,I am eager loading the application.
All is good!
它将执行所有自动加载路径,并将标记诸如由常量名称推断的更改所引起的问题(例如带有缩写的问题)。除升级指南中外,该任务似乎没有被广泛宣传或记录。但是,我实际上有时有时会用它来清除项目中的常量命名问题(即类与文件不匹配的地方)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。