升级到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问题中,我可以找到以下建议:

我不是在寻找解决方法,因此我更正了引发异常的文件

我想找到一种编程方式来检测所有不一致的路径/类名称,而无需在生产模式下运行应用程序。

到目前为止,我想到了三个选择:

  1. 一项瑞克任务,用于验证自动加载(not provided by the gem)。是否存在?您可以在开发环境中从Rails控制台运行一个代码段吗?
  2. rubocop cop或其他静态代码分析器。有吗?
  3. 在测试环境中强制执行紧急负载

在不需要多次迭代/部署的情况下,验证我的代码的建议方法是什么?

非常感谢您

解决方法

您可以使用zeitwerk::check任务检查项目的自动加载兼容性:

$ bin/rails zeitwerk:check
Hold on,I am eager loading the application.
All is good!

它将执行所有自动加载路径,并将标记诸如由常量名称推断的更改所引起的问题(例如带有缩写的问题)。除升级指南中外,该任务似乎没有被广泛宣传或记录。但是,我实际上有时有时会用它来清除项目中的常量命名问题(即类与文件不匹配的地方)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...