RuboCop Naming/FileName cop 在 ExpectMatchingDefinition: true 时抱怨标准文件
RuboCop Naming/FileName cop complains about standard files when ExpectMatchingDefinition: true
我已经在 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
class 定义为 Foo::App::Models::User
的。我评估的每个文件都会发生这种情况。我已经清除了所有的 gems 甚至我的 Ruby 并重新安装,但问题仍然存在。奇怪的是其他同事无法重现问题
有人看到了吗?感谢您的帮助!
我们最近合并了一个 pull request,它为这个 cop 添加了一个新的配置选项 CheckDefinitionPathHierarchy
。启用后,警察将忽略路径,只检查您定义的 class 或模块是否与文件名匹配。
下一个版本的 RuboCop 发布后,您可以将配置文件更新为:
Naming/FileName:
ExpectMatchingDefinition: true
CheckDefinitionPathHierarchy: false
并且与命名空间相关的违规行为应该消失。
我已经在 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
class 定义为 Foo::App::Models::User
的。我评估的每个文件都会发生这种情况。我已经清除了所有的 gems 甚至我的 Ruby 并重新安装,但问题仍然存在。奇怪的是其他同事无法重现问题
有人看到了吗?感谢您的帮助!
我们最近合并了一个 pull request,它为这个 cop 添加了一个新的配置选项 CheckDefinitionPathHierarchy
。启用后,警察将忽略路径,只检查您定义的 class 或模块是否与文件名匹配。
下一个版本的 RuboCop 发布后,您可以将配置文件更新为:
Naming/FileName:
ExpectMatchingDefinition: true
CheckDefinitionPathHierarchy: false
并且与命名空间相关的违规行为应该消失。