Неправильная практика перечислять версию Ruby в обоих файлах Gemfile и .ruby-версии?

Мой последний проект Rails более или менее и экспериментирует для меня, чтобы ломать много вещей и учиться в этом процессе. У меня есть последняя версия Ruby, указанная в моем gemfile:

ruby '2.2.3'

И у меня также есть .ruby-version dotfile в проекте со следующим содержимым:

2.2.3

Помимо очевидного дублирования, что не так с этим? Какова цель обеих конвенций? Если у меня должно быть только одно соглашение о включении моей версии Ruby, почему у меня должен быть один (Gemfile) поверх другого (dotfile)?

Хорошо ли иметь обе конвенции в проекте?

Я собираюсь быть единственным сторонником этого экспериментального проекта и не думаю, что проблема будет заключаться в том, чтобы поддерживать это одно тонкое дублирование. Я не собираюсь обновлять Ruby для этого проекта, и если я это сделаю, у меня не будет проблемы с тем, чтобы делать это в обоих местах. Помимо этой детали, я, конечно, избегаю такого дублирования в кодовых базах приложений.

Ответ 1

Каждый из них разрабатывался разными командами в разное время и использовался различными программами.

Список рубиновой версии в Gemfile - это функция в пакеторе.

Поскольку Gemfile в основном используется только поставщиком, он будет в основном влиять только на то, что вы запускаете с помощью bundler - используя bundle exec или программное обеспечение (например, Rails), которое автоматически запускает для вас пакет. Это эффект просто для ошибки и отказа от запуска, если вы не используете указанную версию рубина. Это требование - запустить под этим рубином, иначе я вышлю ошибку, предупреждая вас, что вы работаете под неправильным рубином.

Однако heroku также обращает внимание на версию, указанную в Gemfile, и будет запускаться под этой версией. Heroku решила использовать эту функцию в комплекте. Но большинство других программ на вашей рабочей станции или даже travis не используют это соглашение. (Трэвис заставляет вас редактировать свой .travis.yml ENV, чтобы указать версию Ruby для использования).

Функция в комплекте была введена в Bundler 1.2 в августе 2012 года.

Файл .ruby-version был впервые представлен rvm, первым менеджером версий Ruby, Если вы используете rvm, и вы переключаетесь в проектную директорию с файлом .ruby-version, rvm автоматически переключит вашу оболочку на использование указанной рубиновой версии.

Я не уверен, когда rvm представила эту функцию, но я думаю, что перед функцией Gumfile "ruby".

Так как rvm представил его, другое программное обеспечение для переключения рубиновых версий, такое как rbenv и chruby, приняло его тоже, чтобы сделать то же самое - автоматически переключитесь на рубиновую версию, указанную при cd в каталог. Хотя я думаю, что с rbenv и chruby оба могут быть необязательной функцией.

Таким образом, они были разными функциями, внедренными и поддерживаемыми различными пакетами программного обеспечения в разное время, делая несколько разные вещи.

Я согласен, что было бы неприятно поддерживать и то и другое, и держать их в синхронизации.

Они оба являются необязательными, вам не нужно использовать ни один. За исключением того, что вам может понадобиться использовать спецификацию Ruby для gemfile для heroku, чтобы сказать, какой рубин вы хотите запустить.

Я тоже лично не использую. Но если вам нужно работать в разных версиях ruby ​​в разных проектах, и вам будет удобно, если ваш рубиновый менеджер версий (rvm, rbenv или chruby) автоматически переключится на правильную версию Ruby, специфичную для проекта, может оказаться полезной .ruby-version.

За исключением целей heroku, включение ruby ​​в Gemfile в основном состоит в том, чтобы не допустить ошибки, например, при развертывании. Или, возможно, внутреннее автоматическое развертывание или среда CI могут использовать их в некотором роде, как это делает герою, или, возможно, другие стеки развертывания облаков будут или будут приняты. Я думаю, многие считают, что это не слишком полезно, хотя - и это тоже, я бы не использовал, пока вы не столкнулись или не увидели проблему, которую он решил. Одно неудобство, которое некоторые люди имеют с перечислением рубиновых версий в Gemfile, заключается в том, что с появлением новых рубинов вы должны постоянно обновлять все свои Gemfiles.

В целом, последние пару лет выпусков рубинов были очень совместимы в обратном направлении, ограничивая необходимость убедиться, что вы используете точную версию ruby, последний код будет работать на самом последнем рубине, даже если он был первоначально написан для более старого.

Я не считаю, что любая функция позволяет указать диапазон рубиновых версий, например 2.2.* или что у вас есть.

Используя либо/обе функции, используйте их только в том случае, если они вам понадобятся, либо вы найдете их полезными, вам также не нужно использовать их, и это нормально (если это раздражает) использовать оба варианта, если вам нужно то, что они делают.

Так как Gemfile - это живой код ruby, теоретически вы можете использовать Gemfile в своем файле .ruby-version и автоматически использовать это значение как значение Gemfile ruby. Если вы хотите использовать и то, и другое, "не повторяйтесь" с ним. Я не знаю, что делать, я просто подумал об этом. Но он должен работать нормально.

Ответ 2

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

Вы можете сохранить рубиновую версию в ".ruby-version", а затем в Gemfile сделать что-то вроде этого:

ruby File.open('.ruby-version', 'rb') { |f| f.read.chomp }

Ответ 3

Используйте это в своем Gemfile:

ruby File.read('.ruby-version').strip

Плюсы:

  • DRY
  • не забудьте обновить версию в одном из файлов
  • это гарантирует, что вы всегда запускаете правильную версию.