升级到 Rails 6 时,是否有一种编程方式来检测 Zeitwerk::NameError?

mab*_*e02 2 ruby ruby-on-rails ruby-on-rails-6 zeitwerk

我目前正在将旧的 Rails 应用程序迁移到 Rails 6。

好像项目中有些文件和里面定义的类不一致。运行应用程序测试时我没有看到此错误,但在部署后我收到如下错误:

 Zeitwerk::NameError: expected file /app/my?_/app/lib/multi_io.rb to define constant MultiIo, but didn't
Run Code Online (Sandbox Code Playgroud)

在以前的 SO 问题中,我可以找到以下建议:

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

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

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

  1. 用于验证自动加载的 rake 任务(gem 不提供)。它存在吗?你有一个片段可以从开发环境中的 rails 控制台运行吗?
  2. rubocop 警察或其他静态代码分析器。有吗?
  3. 在测试环境中强制加载

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

非常感谢你提前

rml*_*erd 5

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

$ bin/rails zeitwerk:check
Hold on, I am eager loading the application.
All is good!
Run Code Online (Sandbox Code Playgroud)

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