Linting за 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 :-). Напълно разбирам, просто имайте предвид някои от фалшивите положителни резултати, които ще получите, които споменах. Ако сте свикнали да кодирате в RM, а не с чист Ruby, е малко вероятно да имате нужда от нещо извън core-lib така или иначе, така че няма проблем. Тъй като по-голямата част от stdlib са Ruby скриптове, в много случаи можете дори да копирате и поставите всичко, от което се нуждаете, към вашия проект. - person ForeverZer0; 20.08.2018