Является ли Rubocop надмножеством проверки синтаксиса "ruby -c"?
У нас был тест, который нашел каждый файл Ruby в нашем приложении и запустил ruby -c
в теме. Мы представили Rubocop и заставили его проверить тот же список файлов.
Это тест, который побежал ruby -c
на самом деле сейчас бесполезно, или есть пример режима сбоя, который будет пойман ruby -c
а не рубокоп?
Документация для ruby -c
говорит:
Заставляет Ruby проверить синтаксис скрипта и выйти без выполнения. Если нет синтаксических ошибок, Ruby выведет "Синтаксис ОК" на стандартный вывод.
Это пример синтаксической проблемы, которая будет обнаружена:
% 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
Рубокоп даже ловит некоторые из тех же предупреждений, хотя у меня не было 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
Я искал с помощью
- https://www.google.com/search?q=rubocop%20syntax%20check%20superset
- https://www.google.com/search?q=is%20there%20any%20reason%20to%20run%20ruby%20-c%20syntax%20check%20if%20i%20use%20rubocop
но я могу делать это неправильно. В Ruby 1.9 тест намного медленнее, чем в Ruby 1.8, поэтому ответ на этот вопрос для меня очень важен. И ты должен признать, тебе любопытно, верно?
2 ответа
Ответ "большую часть времени". RuboCop основывается на геме синтаксического анализатора, который является автономным анализатором Ruby, который более или менее имитирует синтаксический анализатор MRI. RuboCop оборачивает синтаксические проверки синтаксического анализатора и будет правильно сообщать о проблемах. Однако, как указано на GitHub парсера:
К сожалению, МРТ часто меняет синтаксис в версиях уровня патча [...], и не существует простого способа отследить эти изменения.
Эта политика делает практически невозможным сделать Parser точно совместимым с анализатором Ruby MRI.
Кроме того, анализатор поддерживает последнюю минорную версию того релиза, который вы используете, и не создает бэкпорт минорных версий. Поэтому, если вы используете Ruby 2.4.0, RuboCop будет использовать версию парсера, поддерживающую синтаксис 2.4.1.
Для всех целей и задач анализатор эквивалентен официальному анализатору MRI, и, если у вас нет особых причин использовать оба, достаточно использовать только RuboCop.
Rubocop также будет выявлять и сообщать о синтаксических ошибках, поскольку в этом случае код не может быть должным образом проанализирован, поэтому в них нет необходимости.