Ответ 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
. Если вы хотите использовать и то, и другое, "не повторяйтесь" с ним. Я не знаю, что делать, я просто подумал об этом. Но он должен работать нормально.