格式化程序
您可以通过使用-f/--format
选项指定格式化程序来更改RuboCop的输出格式。RuboCop附带了几个内置的格式化程序,您也可以创建自己的自定义格式化程序。
此外,可以使用-o/--out
选项将输出重定向到文件,而不是$stdout
。
一些内置的格式化程序会生成机器可解析的输出,它们被认为是公共API。其余的格式化程序是为人类设计的,因此不建议解析它们的输出。
您可以通过多次指定-f/--format
来同时启用多个格式化程序。-o/--out
选项适用于之前指定的-f/--format
,或者如果在-o/--out
选项之前没有指定-f/--format
,则适用于默认的progress
格式。
# Simple format to $stdout.
$ rubocop --format simple
# Progress (default) format to the file result.txt.
$ rubocop --out result.txt
# Both progress and offense count formats to $stdout.
# The offense count formatter outputs only the final summary,
# so you'll mostly see the outputs from the progress formatter,
# and at the end the offense count summary will be outputted.
$ rubocop --format progress --format offenses
# Progress format to $stdout and JSON format to the file rubocop.json.
$ rubocop --format progress --format json --out rubocop.json
# ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
# | |_______________|
# $stdout
# Progress format to result.txt and simple format to $stdout.
$ rubocop --out result.txt --format simple
# ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
# | |
# default format $stdout
您还可以加载自定义格式化程序。
进度格式化程序(默认)
默认的progress
格式化程序会为每个检查的文件输出一个字符,并在最后以clang
格式显示所有检测到的违规。.
表示一个干净的文件,每个大写字母表示在文件中找到的最严重的违规(约定、警告、错误或致命)。
$ rubocop
Inspecting 26 files
..W.C....C..CWCW.C...WC.CC
Offenses:
lib/foo.rb:6:5: C: Style/Documentation: Missing top-level class documentation comment.
class Foo
^^^^^
...
26 files inspected, 46 offenses detected
自动生成格式化程序
行为类似于进度格式化程序,只是它不会显示任何违规。
$ rubocop --format autogenconf
Inspecting 26 files
..W.C....C..CWCW.C...WC.CC
26 files inspected, 46 offenses detected
Clang样式格式化程序
clang
格式化程序以类似于clang
的方式显示违规。
$ rubocop --format clang test.rb
Inspecting 1 file
W
Offenses:
test.rb:1:5: C: Naming/MethodName: Use snake_case for method names.
def badName
^^^^^^^
test.rb:2:3: C: Style/GuardClause: Use a guard clause instead of wrapping the code inside a conditional expression.
if something
^^
test.rb:2:3: C: Style/IfUnlessModifier: Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &&/||.
if something
^^
test.rb:4:5: W: Layout/DefEndAlignment: end at 4, 4 is not aligned with if at 2, 2
end
^^^
1 file inspected, 4 offenses detected
Fuubar样式格式化程序
fuubar
样式格式化程序显示一个进度条,并在检测到违规时以clang
格式显示违规的详细信息。这是受Fuubar(RSpec的格式化程序)的启发。
$ rubocop --format fuubar
lib/foo.rb.rb:1:1: C: Naming/MethodName: Use snake_case for method names.
def badName
^^^^^^^
lib/bar.rb:13:14: W: Lint/DeprecatedClassMethods: File.exists? is deprecated in favor of File.exist?.
File.exists?(path)
^^^^^^^
22/53 files |======== 43 ========> | ETA: 00:00:02
Pacman样式格式化程序
pacman
样式格式化程序为每个要分析的文件打印一个PACDOT。当没有检测到违规时,Pacman将“吃掉”每个文件的一个PACDOT。否则,它将打印一个幽灵。这是受Pacman(RSpec的格式化程序)的启发。
$ rubocop --format pacman
Eating 31 files
src/foo.rb:1:1: C: Style/FrozenStringLiteralComment: Missing magic comment # frozen_string_literal: true.
src/bar.rb:14:15: C: Style/MutableConstant: Freeze mutable objects assigned to constants.
GHOST = 'ᗣ'
^^^
....ᗣ...ᗣ...ᗧ••••••••••••••••••
31 examples, 2 failures
Emacs样式格式化程序
机器可解析
emacs
格式化程序以适合Emacs
(以及可能的其他工具)使用的格式显示违规。
$ rubocop --format emacs test.rb
/Users/bozhidar/projects/test.rb:1:1: C: Naming/MethodName: Use snake_case for method names.
/Users/bozhidar/projects/test.rb:2:3: C: Style/IfUnlessModifier: Favor modifier if/unless usage when you have a single-line body. Another good alternative is the usage of control flow &&/||.
/Users/bozhidar/projects/test.rb:4:5: W: Layout/DefEndAlignment: end at 4, 4 is not aligned with if at 2, 2
简单格式化器
格式化器的名称说明了一切 :-)
$ rubocop --format simple test.rb
== test.rb ==
C: 1: 5: Naming/MethodName: Use snake_case for method names.
C: 2: 3: Style/GuardClause: Use a guard clause instead of wrapping the code inside a conditional expression.
C: 2: 3: Style/IfUnlessModifier: Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &&/||.
W: 4: 5: Layout/DefEndAlignment: end at 4, 4 is not aligned with if at 2, 2
1 file inspected, 4 offenses detected
文件列表格式化器
机器可解析
有时您可能只想在您最喜欢的编辑器中打开所有包含违规的文件。此格式化器仅输出包含违规的文件的名称,并使您可以执行以下操作
$ rubocop --format files | xargs vim
JSON 格式化器
机器可解析
您可以通过在命令行中传递 --format json
选项以 JSON 格式获取 RuboCop 的检查结果。JSON 结构类似于以下示例
{
"metadata": {
"rubocop_version": "1.12.0",
"ruby_engine": "ruby",
"ruby_version": "3.0.0",
"ruby_patchlevel": "0",
"ruby_platform": "x86_64-darwin19"
},
"files": [{
"path": "lib/foo.rb",
"offenses": []
}, {
"path": "lib/bar.rb",
"offenses": [{
"severity": "convention",
"message": "Line is too long. [81/80]",
"cop_name": "LineLength",
"corrected": true,
"location": {
"line": 546,
"column": 80,
"length": 4
}
}, {
"severity": "warning",
"message": "Unreachable code detected.",
"cop_name": "UnreachableCode",
"corrected": false,
"location": {
"line": 15,
"column": 9,
"length": 10
}
}
]
}
],
"summary": {
"offense_count": 2,
"target_file_count": 2,
"inspected_file_count": 2
}
}
JUnit 风格格式化器
机器可解析
junit
风格格式化器提供 JUnit 格式。此格式化器基于 rubocop-junit-formatter gem。
$ rubocop --format junit
<?xml version='1.0'?>
<testsuites>
<testsuite name='rubocop' tests='2' failures='2'>
<testcase classname='example' name='Style/FrozenStringLiteralComment'>
<failure type='Style/FrozenStringLiteralComment' message='Style/FrozenStringLiteralComment: Missing frozen string literal comment.'>
/tmp/src/example.rb:1:1
</failure>
</testcase>
<testcase classname='example' name='Naming/MethodName'>
<failure type='Naming/MethodName' message='Naming/MethodName: Use snake_case for method names.'>
/tmp/src/example.rb:1:5
</failure>
</testcase>
<testcase classname='example' name='Lint/DeprecatedClassMethods'>
<failure type='Lint/DeprecatedClassMethods' message='Lint/DeprecatedClassMethods: `File.exists?` is deprecated in favor of `File.exist?`.'>
/tmp/src/example.rb:2:8
</failure>
</testcase>
</testsuite>
</testsuites>
junit
风格格式化器对于 Jenkins 等持续集成系统非常有用,大多数持续集成系统在解析测试结果时都支持 junit 格式。在这种情况下,典型的调用可能如下所示
$ rubocop --format junit --out test-reports/junit.xml
由于每个文件中的每个 cop 都有一个 XML 节点,因此生成的 XML 的大小可能会很大。如果它对您来说太大,您可以通过添加 --display-only-failed
选项将输出限制为仅失败。
违规计数格式化器
有时,当第一次将 RuboCop 应用于代码库时,能够看到大部分样式清理将在哪里进行会很好。
考虑到这一点,您可以使用违规计数格式化器来概述违规的 cop 以及为每个 cop 找到的违规数量,方法是运行
$ rubocop --format offenses
36 Layout/LineLength [Safe Correctable]
18 Style/StringLiterals [Safe Correctable]
13 Style/Documentation
10 Style/ExpandPathArguments [Safe Correctable]
8 Style/EmptyMethod [Safe Correctable]
6 Layout/IndentationConsistency [Safe Correctable]
4 Lint/SuppressedException
3 Layout/EmptyLinesAroundAccessModifier [Safe Correctable]
2 Layout/ExtraSpacing [Safe Correctable]
1 Layout/AccessModifierIndentation [Safe Correctable]
1 Style/ClassAndModuleChildren [Unsafe Correctable]
--
102 Total in 31 files
最严重违规者格式化器
类似于违规计数格式化器,但列出最需要关注的文件
$ rubocop --format worst
89 this/file/is/really/bad.rb
2 much/better.rb
--
91 Total in 2 files
HTML 格式化器
对 CI 环境很有用。它将创建一个类似于 此 的 HTML 报告。
$ rubocop --format html -o rubocop.html
Markdown 格式化器
对 CI 环境很有用,尤其是在将评论发布回拉取请求时。它将创建一个类似于 此 的 markdown 报告。
$ rubocop --format markdown -o rubocop.md
TAP 格式化器
机器可解析
对 CI 环境很有用,它将按照 Test Anything Protocol 格式化报告。
$ rubocop --format tap
1..3
not ok 1 - lib/rubocop.rb
# lib/rubocop.rb:2:3: C: foo
# This is line 2.
# ^
ok 2 - spec/spec_helper.rb
not ok 3 - exe/rubocop
# exe/rubocop:5:2: E: bar
# This is line 5.
# ^
# exe/rubocop:6:1: C: foo
# This is line 6.
# ^
3 files inspected, 3 offenses detected
GitHub Actions 格式化程序
对 GitHub Actions 有用。将违规格式化为 工作流命令,以便在 GitHub UI 中创建注释。
格式化程序使用 fail_level 来确定为每个注释使用哪个 GitHub 等级。默认情况下,所有 RuboCop 严重性都是错误。如果设置了 fail level 且严重性低于 fail level,则会创建警告。
$ rubocop --format github
::error file=lib/foo.rb,line=6,col=5::Style/Documentation: Missing top-level class documentation comment.