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

时间:2017-05-25 21:00:44

标签: ruby rubocop

我们有一个测试,它在我们的应用程序中找到了每个Ruby文件并在其上运行ruby -c。我们介绍了Rubocop,并检查了相同的文件列表。

运行ruby -c的测试现在实际上是无用的,或者是否有ruby -c而非Rubocop捕获的失败模式的示例?

ruby -c的文档说:

  

使Ruby检查脚本的语法并退出而不执行。如果没有语法错误,Ruby将打印"语法OK"到标准输出。

这是一个语法问题的示例,它将被以下任何一个捕获:

% 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中慢,所以这个问题的答案对我来说实际上很有价值。而你必须承认,你很好奇,对吧?

2 个答案:

答案 0 :(得分:3)

答案是“大部分时间”。 RuboCop构建于解析器gem之上,解析器gem是一个独立的Ruby解析器,它或多或少地模仿MRI解析器。 RuboCop包装解析器的语法检查,并将正确报告问题。但是,正如解析器的GitHub所述:

  

不幸的是,MRI通常会在补丁级别版本中更改语法   [...]没有简单的方法来跟踪这些变化。

     

这项政策几乎不可能让Parser准确无误   兼容Ruby MRI解析器。

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

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

答案 1 :(得分:2)

Rubocop还将识别并报告语法错误,因为如果是这样的话,代码将无法正确解析,因此不需要两者。