В этой статье я сравниваю самые популярные менеджеры версий для Ruby на Mac: Chruby, Rbenv, RVM, а также Asdf, менеджер версий для нескольких языков, и Frum, совершенно новый менеджер версий, написанный на Rust. Я дам рекомендации на основе того, что вам, скорее всего, понадобится.
Предварительно установленный Ruby не для разработчиков
Те, кто новичок в Ruby, радуются, обнаружив, что Ruby поставляется вместе с macOS. Им часто неприятно узнавать от более опытного разработчика: “Не используйте системный Ruby Mac”. Я писал в другом месте о причинах. Короче говоря, системный Ruby предназначен для macOS, а не для вас. Он подходит для запуска скриптов-утилит, но для разработки системный Ruby устарел, и, если не быть осторожным, установка геммов может вызвать проблемы (включая нарушения системной безопасности).
Проблема Homebrew с одним Руби
Homebrew — это менеджер пакетов, который стал почти стандартом для добавления программного обеспечения для разработчиков в macOS. Homebrew облегчает установку новой версии Ruby, чтобы не полагаться на системный Ruby. Но есть две проблемы с Homebrew. Во-первых, версия Ruby Homebrew может автоматически и неожиданно заменяться на более новую версию при установке других пакетов Homebrew (проблема решена с помощью brew pin ruby
). Более важно, что Homebrew позволяет установить только одну версию Ruby. Если вы разрабатываете или поддерживаете более одного проекта на Ruby, вам, вероятно, потребуется переключаться между версиями Ruby. Вот тут-то вам и понадобится менеджер версий.
Asdf для множества языков
Asdf — это менеджер версий, который поддерживает множество языков. Если вы используете Ruby для разработки веб-приложений с помощью Rails 6, вам потребуется установить Node и Yarn для создания стартерного приложения Rails. (Возможно, Rails 7 устранит необходимость в Node, но на данный момент это не точно.)
Таким образом, для разработчика Rails Asdf является идеальным менеджером версий. Он также хорошо подойдет, если вы разрабатываете приложения на Python, Elixir или многих других языках (см. список поддерживаемых языков). Есть ли недостатки в использовании Asdf? Всего два. Он использует шимы для перехвата общих команд, что может затруднить устранение неполадок. Также он может быть немного медленным для некоторых операций. Если вы разрабатываете на нескольких языках, я рекомендую попробовать Asdf, чтобы увидеть, понравится ли он вам. Переключитесь на Frum, менеджер версий Ruby, написанный на Rust, если вы обнаружите, что Asdf замедляет вас.
Менеджеры версий только для Ruby
Если вы планируете разрабатывать приложения только с использованием Ruby, выбирайте среди четырех менеджеров версий только для Ruby: Chruby, Frum, Rbenv и RVM. Различия между ними заключаются в скорости, сложности и способе переключения версий Ruby. Давайте рассмотрим самый старый первым: RVM.
RVM
RVM был первым популярным менеджером версий для Ruby. Он по-прежнему поддерживается и широко используется. RVM модифицирует системную команду cd
, чтобы устанавливать переменные среды при смене директорий. Чтобы переопределить команду cd
, скрипт установки RVM изменяет файл конфигурации shell (файл ~/.zshrc
на новых Mac).
RVM корректно отображает переменные среды, чтобы показать версию Ruby и местоположение гема, что может помочь диагностировать проблемы. Однако RVM включает дополнительные функции, такие как gemsets. Gemsets больше не нужны, так как Bundler был добавлен в основной Ruby для управления зависимостями гема. Дополнительная сложность не нужна, поэтому многие разработчики перешли к более новым менеджерам версий, таким как Rbenv, Chruby или Frum.
Rbenv
Наряду с RVM, Rbenv долгое время был одним из самых популярных менеджеров версий для Ruby. Rbenv использует шимы для перехвата общих команд Ruby. (Asdf также использует шимы.)
После установки Rbenv с помощью Homebrew, необходимо изменить файл ~/.zshrc
, чтобы шимы Rbenv имели приоритет над обычными командами Ruby. Шим вызывает команду rbenv exec
, которая определяет, какую версию Ruby использовать перед выполнением любой команды Ruby.
Шины имеют два недостатка. Во-первых, шины затрудняют устранение неполадок, скрывая фактический команду. Например, команда which ruby
показывает шину Rbenv, а не фактическую версию Ruby (необходимо установить переменную окружения RBENV_DEBUG
, если вы хотите увидеть фактическую команду Ruby). Во-вторых, шина может добавить микросекунды задержки при выполнении команды Ruby. (Rbenv вмешивается каждый раз, когда вы запускаете команду Ruby, в отличие от RVM, который вмешивается только при смене директорий.) Для разработчиков, которые замечают задержку или не любят идею шин, есть Chruby или Frum.
Chruby
Chruby не так хорошо известен, как RVM или Rbenv, но его поддерживают несколько известных разработчиков Ruby. В отличие от RVM, он не переопределяет команду cd
. В отличие от Rbenv или Asdf, он не перехватывает команды с помощью шин. Вам нужно будет изменить файл ~/.zshrc
, чтобы Chruby работал в вашей локальной среде оболочки. Нет необходимости изменять ваш $PATH
, так как Chruby делает это за вас, основываясь на выбранной версии Ruby.
Chruby также устанавливает определенные переменные окружения для Ruby. Это все, что нужно для переключения между версиями Ruby с помощью Chruby. Он отлично работает для устранения неполадок с помощью which
. Я использовал Chruby несколько лет и не столкнулся с проблемами. Chruby – отличный выбор, но вы можете попробовать Frum, самый новый менеджер версий Ruby.
Frum
Frum написан на Rust, хорошем языке для быстрого выполнения системного программного обеспечения в командной строке. Frum новый (вышел в начале 2021 года). В отличие от Asdf, Chruby или Rbenv, он включает встроенную команду установки Ruby, поэтому для установки Ruby не нужно дополнительное программное обеспечение. Установщик быстрый, и Frum не требует зависимостей (это единичный исполняемый файл Rust, который можно установить с помощью Homebrew).
После установки Frum необходимо изменить файл ~/.zshrc
, чтобы Frum запускался в локальной среде shell. Как и другие менеджеры версий, он проверяет наличие файла .ruby-version
в каталоге проекта, и если для проекта не указана версия, он будет использовать глобальную версию Ruby. В нем нет шлифов (в отличие от Asdf или Rbenv) и он не переопределяет команду cd
(в отличие от RVM). Хотя он новый, я рекомендую его, потому что он универсальный и быстрый.
Установка менеджера версий для Ruby
I’ve written a complete guide to installing Ruby on Mac. In the guide, I provide instructions for:
- установка Ruby с помощью Asdf
- установка Ruby с помощью Frum
- установка Ruby с помощью Chruby
- установка Ruby с помощью Homebrew
Если вы хотите изучить RVM или Rbenv, см.:
A Note about Docker
Если вы упомянете менеджеры версий Ruby, кто-то, вероятно, скажет: “Я использую Docker”. Docker — это инструмент контейнеризации, который некоторые разработчики используют для управления версиями. Основное применение Docker — создание воспроизводимого виртуального сервера, содержащего настроенную версию любых зависимостей программного обеспечения, необходимых для запуска приложения (язык, базы данных, очереди сообщений). Таким образом, он идеален для создания “замороженной” версии окружения разработки для развертывания на сервере.
Вы также можете разрабатывать локально в контейнере, но он будет работать медленнее, потребует больше памяти и добавит сложности конфигурации по сравнению с менеджером версий. Чтобы сохранить простоту, я избегаю Docker для локальной разработки, если приложение не является чрезвычайно сложным.
Заключение
Если вы работаете над несколькими проектами на Ruby, вы не просто случайный пользователь Ruby. Убедитесь, что в вашем локальном окружении разработки установлен отличный менеджер версий.
I like Asdf because I develop in Ruby and JavaScript and Asdf gives me one version manager for both languages. However, Asdf uses shims (like Rbenv) so occasionally it’s slower than I like. I also find it annoying that Asdf hides the actual command from troubleshooting with the which
command. If these drawbacks outweigh the convenience of managing multiple languages, I recommend using Frum to switch among your Ruby versions. Version managers should be simple and stay out of your way when you’re working.
Часто задаваемые вопросы (FAQ) о менеджерах версий Ruby для MacOS
Каковы ключевые различия между RVM и rbenv?
RVM (Ruby Version Manager) и rbenv — обе это инструменты для управления несколькими версиями Ruby на вашей системе. Основное различие заключается в их подходе. RVM более функционально богат и позволяет управлять gemsets — набором гемсов, используемых для конкретного приложения Ruby. С другой стороны, rbenv проще и фокусируется только на переключении версий Ruby. Он не поддерживает gemsets, но вы можете достичь аналогичной функциональности с помощью плагина под названием ruby-build.
Как установить конкретную версию Ruby с помощью RVM?
Чтобы установить конкретную версию Ruby с помощью RVM, вы можете использовать команду ‘rvm install’, за которой следует номер версии. Например, для установки Ruby 2.6.3, вы бы использовали команду ‘rvm install 2.6.3’. После установки вы можете переключиться на эту версию, используя команду ‘rvm use’, например, ‘rvm use 2.6.3’.
Могу ли я использовать как RVM, так и rbenv на одной системе?
Хотя технически возможно иметь как RVM, так и rbenv установленными на одной системе, это, как правило, не рекомендуется. Оба инструмента изменяют ваше окружение командной строки, и наличие обоих может привести к непредсказуемому поведению. Лучше выбрать один на основе ваших нужд и придерживаться его.
Как удалить версию Ruby с помощью rbenv?
Чтобы удалить версию Ruby с помощью rbenv, вы можете использовать команду ‘rbenv uninstall’, за которой следует номер версии. Например, чтобы удалить Ruby 2.6.3, вы бы использовали команду ‘rbenv uninstall 2.6.3’.
Как установить версию Ruby по умолчанию с помощью RVM?
Для установки значения по умолчанию версии Ruby с использованием RVM, можно использовать команду ‘rvm –default use’, за которой следует номер версии. Например, для установки Ruby 2.6.3 по умолчанию, используйте команду ‘rvm –default use 2.6.3’.
Как обновить rbenv и его плагины?
Для обновления rbenv и его плагинов, используйте git. Перейдите в каталог rbenv в терминале (обычно ‘~/.rbenv’) и запустите ‘git pull’. Затем перейдите в каждый каталог плагина и проделайте то же самое.
Могу ли я использовать RVM или rbenv с другими языками программирования?
RVM и rbenv специально разработаны для управления версиями Ruby. Если вам нужно управлять версиями других языков программирования, вам, возможно, придется обратиться к инструментам, таким как pyenv для Python или nvm для Node.js.
Как вывести список всех установленных версий Ruby с помощью rbenv?
Чтобы вывести список всех установленных версий Ruby с помощью rbenv, используйте команду ‘rbenv versions’. Это покажет список всех версий Ruby, которые может использовать rbenv.
Как управлять зависимостями gem с помощью RVM?
RVM позволяет управлять зависимостями gem через использование gemsets. Вы можете создать gemset с помощью команды ‘rvm gemset create’, перейти к нему с помощью команды ‘rvm gemset use’, а затем устанавливать необходимые gem.
Как установить новую версию Ruby с помощью rbenv?
Чтобы установить новую версию Ruby с помощью rbenv, используйте команду ‘rbenv install’, за которой следует номер версии. Например, для установки Ruby 2.6.3 используйте команду ‘rbenv install 2.6.3’.
Source:
https://www.sitepoint.com/ruby-version-managers-macos/