Rubocop 是 "ruby -c" 语法检查的超集吗?

Is Rubocop a superset of the "ruby -c" syntax check?

我们进行了一项测试,在我们的应用程序中找到了每个 Ruby 文件,并且在其上找到了 运行 ruby -c。我们引入了 Rubocop 并使其检查相同的文件列表。

运行 ruby -c 的测试现在实际上是无用的,还是有一个失败模式的例子可以被 ruby -c 而不是 Rubocop 捕获?

ruby -c 的文档说:

Causes Ruby to check the syntax of the script and exit without executing. If there are no syntax errors, Ruby will print "Syntax OK" to the standard output.

这是语法问题的示例,将被下列任一问题捕获:

% echo "puts 'hello world" > hot_script.rb
% ruby -c hot_script.rb
hot_script.rb:1: unterminated string meets end of file

% rubocop hot_script.rb
Inspecting 1 file
F

Offenses:

hot_script.rb:1:6: F: unterminated string meets end of file
(Using Ruby 1.9 parser; configure using TargetRubyVersion parameter, under AllCops)
puts 'hello world
     ^

1 file inspected, 1 offense detected

Rubocop 甚至捕获了一些相同的警告,尽管我之前没有配置 ruby -c 来捕获这些警告,因此我对错误更感兴趣。这是处理警告的相对对等示例:

% cat unused_var.rb
def hot_method
  a = 1
  b = 2
  puts b
end

% ruby -cwW2 unused_var.rb
unused_var.rb:2: warning: assigned but unused variable - a
Syntax OK

% rubocop unused_var.rb
Inspecting 1 file
W

Offenses:

unused_var.rb:2:3: W: Lint/UselessAssignment: Useless assignment to variable - a.
  a = 1
  ^

1 file inspected, 1 offense detected

我使用

搜索

但我可能做错了。 Ruby 1.9 中的测试比 Ruby 1.8 中的测试慢得多,所以这个问题的答案对我来说实际上很有价值。而且你不得不承认,你很好奇,对吧?

Rubocop 还将识别并报告语法错误,因为在这种情况下无法正确解析代码,因此不需要两者。

答案是 "most of the time." RuboCop 建立在解析器 gem 之上,它是一个独立的 Ruby 解析器,或多或少地模仿了 MRI 解析器。 RuboCop 包装了解析器的语法检查,并将正确报告问题。但是,如解析器的 GitHub:

所述

Unfortunately MRI often changes syntax in patch level versions [...] there is no simple way to track these changes.

This policy makes it all but impossible to make Parser precisely compatible with the Ruby MRI parser.

此外,解析器支持您使用的任何版本的最新次要版本,并且不向后移植次要版本。因此,如果您使用 Ruby 2.4.0,RuboCop 将使用支持 2.4.1 语法的解析器版本。

就所有意图和目的而言,解析器等同于官方 MRI 解析器,除非您有特定的理由同时使用两者,否则单独使用 RuboCop 就足够了。