3

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

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

 Zeitwerk::NameError: expected file /app/my?_/app/lib/multi_io.rb to define constant MultiIo, but didn't

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

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

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

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

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

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

非常感谢你

4

2 回答 2

6

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

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

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

于 2020-09-16T22:04:07.807 回答
1

bin/rails zeitwerk:check@rmlockerd在他的回答中描述最好的工具之一。

我发现信息丰富的其他文章是:

我采取的过程是运行bin/rails zeitwerk:check修复错误,再次运行它直到我看到“一切都很好”。之后解决了我们的规范测试报告的错误。

要解决的一个普遍问题是,如果文件夹不在 Rails 默认文件结构中,Zeitwerk 将无法在自动加载时找到它。我们有一个名为“services”( app/services) 的文件夹,需要将其添加到 application.rb 文件中的自动加载路径中,例如:

config.autoload_paths += %W(#{config.root}/app/services/)

错误:

path/file_name.rb定义常量 FileName 的预期文件

修复: 删除引用定义类的任何文件requirerequire_relative其他文件(Zeitwerk 不需要它们)。

错误(类在子目录的模块中定义):

NameError: 未初始化的常量 SubFile::ClassName

使固定:

在另一个 S/O 答案中有详细说明。每当在子文件夹中使用方法时,都会将调用结构为Folder::SubDirectory::Class.method_call

祝你好运!

于 2021-09-15T04:38:25.187 回答