扩展
可以使用自定义(第三方)cop 和格式化程序扩展 RuboCop。
加载扩展
除了 --require
命令行选项外,您还可以在 .rubocop.yml
文件中使用可选的 require
指令指定要加载的 ruby 文件。
require:
- ../my/custom/file.rb
- rubocop-extension
这些路径将直接传递给 Kernel.require 。如果您的扩展文件不在 $LOAD_PATH 中,您需要显式地指定路径作为以 ./ 为前缀的相对路径或绝对路径。以 . 开头的路径相对于 .rubocop.yml 解析。如果给定包含 - 的路径,它将按原样使用,但如果我们找不到要加载的文件,我们将用 / 替换 - 并再次尝试,就像 Bundler 加载 gem 时一样。
|
扩展建议
根据您在捆绑包中拥有的 gem,RuboCop 可能会建议可以添加的扩展以提供更多功能。例如,如果您使用 rspec
但没有相应的 rubocop-rspec
扩展,RuboCop 会建议启用它。
可以通过在配置中添加以下内容来禁用此消息
AllCops:
SuggestExtensions: false
如果 SuggestExtensions: true
,则建议默认扩展。
您也可以选择退出对特定扩展库的建议,如下所示(未指定的扩展将继续根据需要发出通知)
AllCops:
SuggestExtensions:
rubocop-rake: false
自定义 Cop
您可以在 .rubocop.yml
中配置自定义 cop,就像任何其他 cop 一样。
Cop 扩展
主要的 RuboCop gem 侧重于核心 Ruby 语言,不包括与任何外部 Ruby 库/框架相关的功能。但是,有许多专门针对这些库/框架的 RuboCop 扩展,其中一些由 RuboCop 的核心团队维护。
官方扩展
-
rubocop-performance - 性能优化分析
-
rubocop-rails - Rails 特定分析
-
rubocop-rspec - RSpec 特定分析
-
rubocop-minitest - Minitest 特定分析
-
rubocop-rake - Rake 特定分析
-
rubocop-sequel - Sequel gem 代码风格检查
-
rubocop-thread_safety - 线程安全分析
-
rubocop-capybara - Capybara 特定分析
-
rubocop-factory_bot - factory_bot 特定分析
-
rubocop-rspec_rails - RSpec Rails 特定分析
第三方扩展
-
rubocop-require_tools - 缺少
require
语句的动态分析 -
rubocop-i18n - i18n 包装函数分析 (
gettext
和rails-i18n
) -
cookstyle - Chef Infra Cookbooks 的自定义规则和默认配置
-
rubocop-packaging - 下游 (例如 Debian 包) 兼容性的上游最佳实践和编码规范。
-
rubocop-sorbet - Sorbet 特定分析
-
rubocop-graphql - GraphQL 特定分析
-
rubocop-changed - 通过仅分析更改的文件来减少 CI 时间
-
rubocop-sketchup - SketchUp Ruby API 特定分析
有任何缺少的扩展?向我们发送 Pull Request!
配置扩展
如果您正在编写扩展,您可以将部分配置绑定到 RuboCop。
配置弃用
当已发布的规则后来被重命名或删除,或其参数之一被更改时,RuboCop 可以输出错误消息,让用户知道将他们的配置更新为最新值。如果遇到任何过时的配置,RuboCop 将输出错误消息并退出。
您可以通过创建自己的 obsoletions.yml
文件并让 RuboCop 知道在哪里找到它来将您的扩展绑定到此系统
RuboCop::ConfigObsoletion.files << File.expand_path(filename)
目前有三种类型的弃用可以为规则定义
-
renamed
: 规则已更改为具有新名称,或移动到不同的部门。 -
removed
: 规则已删除(通常这配置有alternatives
或reason
说明为什么它被删除)。 -
split
: 规则已删除并被多个其他规则替换。
还有两种类型可用于定义参数更改。这些配置可以同时应用于多个规则和多个参数(因此在 YAML 中以哈希数组的形式表示)
-
changed_parameters
: 参数已重命名。 -
changed_enforced_styles
: 之前接受的EnforcedStyle
值已更改或删除。
参数弃用可以通过 severity: warning 设置,以弃用旧参数,但仍接受它。RuboCop 将输出警告,但继续运行。
|
弃用配置示例
有关更多示例,请参阅 config/obsoletion.yml
。
所有复数键(例如 cops 、parameters 、alternatives 等)可以取单个值或数组。
|
renamed:
Layout/AlignArguments: Layout/ArgumentAlignment
Lint/BlockAlignment: Layout/BlockAlignment
removed:
Layout/SpaceAfterControlKeyword:
alternatives: Layout/SpaceAroundKeyword
Lint/InvalidCharacterLiteral:
reason: it was never being actually triggered
split:
Style/MethodMissing:
alternatives:
- Style/MethodMissingSuper
- Style/MissingRespondToMissing
changed_parameters: # must be an array of hashes
- cops:
- Metrics/BlockLength
- Metrics/MethodLength
parameters: ExcludedMethods
alternative: IgnoredMethods
severity: warning
changed_enforced_styles: # must be an array of hashes
- cops: Layout/IndentationConsistency
parameters: EnforcedStyle
value: rails
reason: >
`EnforcedStyle: rails` has been renamed to
`EnforcedStyle: indented_internal_methods`
自定义格式化程序
模板支持
RuboCop 具有 API,用于扩展以支持 ERB、Haml、Slim 等模板。
通常,RuboCop 从一个 Ruby 文件中提取一个 Ruby 代码,但是一个模板文件中有多个嵌入式 Ruby 代码。为了解决这个问题,RuboCop 具有一个称为 RuboCop::Runner.ruby_extractors
的机制,任何 Ruby 提取器都可以添加到扩展端。
Ruby 提取器必须是一个可调用对象,它接受一个 RuboCop::ProcessedSource
并返回一个包含 Ruby 源代码及其从原始源代码的偏移量的 Hash
的 Array
,或者对于不相关的文件返回 nil
。
ruby_extractor.call(processed_source)
Ruby 提取器返回的示例值如下所示
[
{
offset: 2,
processed_source: #<RuboCop::ProcessedSource>
},
{
offset: 10,
processed_source: #<RuboCop::ProcessedSource>
}
]
在扩展端,代码将类似于以下内容
RuboCop::Runner.ruby_extractors.unshift(ruby_extractor)
RuboCop::Runners.ruby_extractors
从头开始处理,并在其中一个返回非空值时结束。默认情况下,有一个 Ruby 提取器返回给定的 Ruby 源代码,偏移量为 0,因此您可以在它之前添加任何 Ruby 提取器。
这仍然是一个实验性功能,将来可能会更改。 |