【问题标题】:RuboCop Naming/FileName cop complains about standard files when ExpectMatchingDefinition: trueRuboCop Naming/FileName cop 在 ExpectMatchingDefinition: true 时抱怨标准文件
【发布时间】:2020-05-08 22:35:27
【问题描述】:

我在 Rubocop 文档中搜索了有关此内容的信息,但似乎无法理解发生了什么。

从一个名为“Foo”的全新 Rails 应用程序 (6.0.2.2) 开始,我将以下 gem 添加到我的 Gemfile 并安装它们:

gem 'rubocop', '~> 0.80.0', require: false
gem 'rubocop-checkstyle_formatter', require: false
gem 'rubocop-rails_config', require: false

目前已解决的 RuboCop 版本(鉴于我的版本限制)是 0.80.1

然后我添加一个简单的模型:rails g model user name:string,它创建了app/models/user.rb。仅在该文件上运行 RuboCop, 没有 任何自定义配置文件,它只会抱怨没有冻结的字符串文字。我在与bundle exec rubocop app/models/user.rb 捆绑的上下文中执行此操作并获得以下信息:

Inspecting 1 file
C

Offenses:

app/models/user.rb:1:1: C: Style/FrozenStringLiteralComment: Missing frozen string literal comment.
class User < ApplicationRecord
^

然后将我的自定义.rubocop.yml文件添加到启用此规则的项目中,这与标准配置中的默认值不同:

Naming/FileName:
  ExpectMatchingDefinition: true

重新运行分析后,会出现这种新的攻击:

app/models/user.rb:1:1: C: Naming/FileName: user.rb should define a class or module called Foo::App::Models::User.
class User < ApplicationRecord
^

注意它希望User 类定义为Foo::App::Models::User。我评估的每个文件都会发生这种情况。我已经清除了我所有的 gem,甚至我的 Ruby 并重新安装了,但问题仍然存在。奇怪的是其他同事无法重现该问题。

有人看过吗?感谢您的帮助!

【问题讨论】:

  • rubocop-rails_config 适用于 Rails 框架代码,而不适用于您创建的 Rails 应用程序。相反,您可以使用github.com/rubocop-hq/rubocop-rails(这有点令人困惑,因为 rubocop-rails_config 曾经被称为 rubocop-rails,但被重命名为:github.com/toshimaru/rubocop-rails/issues/31
  • 感谢@AndyWaite 的回复。我尝试了你的建议。将rubocop-rails_config 替换为rubocop-rails,但问题仍然存在——RuboCop 仍然希望我的班级被称为Foo::App::Models::User。这就是我现在的Gemfile.lock 中的内容:rubocop (0.80.1) rubocop-checkstyle_formatter (0.4.0) rubocop-rails (2.5.2)

标签: ruby-on-rails rubocop


【解决方案1】:

我们最近刚刚合并了一个pull request,它为这个警察添加了一个新的配置选项CheckDefinitionPathHierarchy。启用后,警察将忽略路径,仅检查您定义的类或模块是否与文件名匹配。

下一版 RuboCop 发布后,您可以将配置文件更新为:

Naming/FileName:
  ExpectMatchingDefinition: true
  CheckDefinitionPathHierarchy: false

与命名空间相关的违规行为应该消失。

【讨论】:

  • 感谢@Drenmi,我已经更新了 gem 并添加了配置,攻击消失了。不幸的是,这意味着在我的整个应用程序中都禁用了检查文件路径。我原以为旧配置不希望像Foo::App::Models::User 那样完全命名标准模型,但我至少可以避免让 RuboCop 抱怨我的应用程序中的每个文件。
猜你喜欢
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2018-02-02
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 2018-06-10
相关资源
最近更新 更多