格式化程序

您可以通过使用-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 quiet

文件列表格式化器

机器可解析

有时您可能只想在您最喜欢的编辑器中打开所有包含违规的文件。此格式化器仅输出包含违规的文件的名称,并使您可以执行以下操作

$ 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.