我们有一个测试,它在我们的应用程序中找到了每个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中慢,所以这个问题的答案对我来说实际上很有价值。而你必须承认,你很好奇,对吧?
答案 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还将识别并报告语法错误,因为如果是这样的话,代码将无法正确解析,因此不需要两者。