Линтинг для Ruby ‹ 2.0.0

У меня есть проект со многими файлами Ruby, загруженными внешней программой со встроенным интерпретатором Ruby (и некоторыми другими библиотеками). Я пытаюсь использовать RubyMine и Rubocop для помощи в разработке, но проблема в том, что указанный встроенный интерпретатор имеет версию 1.9.2 и никак не может быть обновлен. Можно ли по-прежнему использовать Rubocop или другой линтер внутри RubyMine и при этом убедиться, что код совместим со старым интерпретатором?


person Cerberus    schedule 19.08.2018    source источник


Ответы (2)


Да, можете, Проверьте это, а затем сообщите RuboCop самую старую версию Ruby, которую поддерживает ваш проект, с обновлением файла .rubocop.yml:

AllCops:
  TargetRubyVersion: 1.9
person RmK    schedule 20.08.2018

Короткий ответ: да, можно изменить линтер, используемый в RubyMine, на сайте JetBrains есть полные пошаговые инструкции, объясняющие, как это сделать. Я не знаю навскидку какие-либо линтеры, которые специально работают для версий Ruby до 2.0, не говоря уже о том, что их не существует.

Более длинный ответ заключается в том, что на самом деле не будет большой разницы, если интерпретатор работает через другую программу, а не использует настоящую установку Ruby, и любой линтер не будет надежно работать для вас. Будет много кода, который линтер по-прежнему будет считать вполне приемлемым, но не сможет работать во встроенной виртуальной машине.

# Linter thinks this perfectly fine, part of 1.9.2 standard library
require 'base64' 

# Still thinks this perfectly fine. This all fails miserably though
Base64.encode64('My string')

Наиболее очевидными примерами могут быть вся стандартная библиотека, драгоценные камни, рейк и все, что не является частью "основной" библиотеки. Основное эмпирическое правило: если вам нужно require скрипт (исключая локальные скрипты вашего проекта), он не будет работать.

Другая причина, по которой он никогда не может быть надежным, заключается в том, что вы не знаете, был ли изменен встроенный интерпретатор Ruby или удалены ли функции из Ruby для своих целей, а у линтера будет еще меньше возможностей узнать об этом. Несколько лет назад я баловался серией RPG Maker и на собственном горьком опыте обнаружил, что они были определенными встроенными функциями Ruby, которые были удалены (или, по крайней мере, скрыты) из их пользовательской сборки.

Если вы знакомы с Ruby, то вы, очевидно, можете избежать основных и наиболее распространенных изменений 2.0+, которые Ruby внедрил в основную библиотеку, но единственный надежный способ узнать (даже с помощью линтера) — это тестирование, которое вы будете нужно сделать в любом случае (или, по крайней мере, вы должны). RubyMine имеет хорошую поддержку для автоматизации этого с помощью Minitest и RSpec.

person ForeverZer0    schedule 20.08.2018
comment
Я просто ищу помощи, не более того. Конечно, о конкретных возможностях интерпретатора (кстати, вы правильно догадались, все дело в RPG Maker :)) должен позаботиться я сам. - person Cerberus; 20.08.2018
comment
Я предположил, что именно 1.9.2 это был РМ :-). Полностью понимаю, просто имейте в виду некоторые из ложных срабатываний, которые вы получите, о которых я упоминал. Если вы привыкли программировать на RM, а не на чистом Ruby, вам все равно вряд ли понадобится что-то помимо основной библиотеки, так что ничего страшного. Поскольку большая часть stdlib представляет собой сценарии Ruby, во многих случаях вы даже можете копировать и вставлять в свой проект все, что вам нужно. - person ForeverZer0; 20.08.2018