Вы только что установили свежий Ubuntu, открыли терминал с мечтами о новом Rails-проекте… И тут “ruby: command not found”. Знакомо? Добро пожаловать в мир менеджеров Ruby-версий — где одни спасают ваши нервы, а другие их испытывают. Сегодня разберём трёх китов: RVM, rbenv и chruby, их больные места и подводные камни.
🧐 Зачем вообще эти менеджеры?
Потому что:
- Проекты живут на разных версиях Ruby (Rails 6 требует 2.7, а legacy-монстр — 2.3)
- Системный Ruby — зло (попробуйте
sudo gem installи получите права на свой же сервер) - Gemset’ы (чтобы
bundle installне превращался в игру “найди конфликтующую гему”)
Идеальный менеджер должен:
- Быстро переключать версии
- Не ломать PATH
- Работать без танцев с бубном
- Не заставлять вас редактировать
.bashrcкаждые 2 часа
� RVM: “Я — король!”
RVM (Ruby Version Manager) — дедушка менеджеров. Устанавливается одной командой, умеет всё, но… иногда слишком много.
# Установка (крепко держитесь)
\curl -sSL https://get.rvm.io | bash -s stable
👍 Плюсы:
- Автоматические gemset’ы (
rvm use 3.1.0@myapp —create) - Интеграция с Bundler (
rvm . do bundle install) - Богатая документация (и 100500 способов сломать себе систему)
👎 Минусы:
- Переписывает ваш shell (попробуйте
type cdпосле установки) - Медленный (каждый новый терминал грузит всю обвязку)
- “Магический” (иногда непонятно, почему он решил использовать именно эту версию)
💀 Антипаттерн:
# Не делайте так! Это переключит Ruby ГЛОБАЛЬНО
rvm use 3.0.0
🧊 rbenv: “Минимализм — наше всё”
rbenv — ответ хипстеров на RVM. Никакой магии, только PATH и symlinks.
# Установка через Homebrew (macOS) или git
brew install rbenv ruby-build
👍 Плюсы:
- Не лезет в shell (просто добавляет пару строк в PATH)
- Предсказуемость (версия выбирается по
.ruby-versionили черезrbenv local) - Плагины (например,
rbenv-varsдля env-переменных)
👎 Минусы:
- Нет встроенных gemset’ов (придётся использовать
bundlerилиdirenv) - Требует ручной сборки Ruby (но
ruby-buildрешает)
🎯 Идеальный сценарий:
# Устанавливаем Ruby
rbenv install 3.2.2
# Назначаем версию для проекта
cd my_project
rbenv local 3.2.2
# Profit! Теперь даже `cd` будет подхватывать версию
⚡ chruby: “Я просто переключаю Ruby”
chruby — это 100 строк кода, которые делают ровно одну вещь: меняют $PATH.
# Установка (macOS)
brew install chruby ruby-install
👍 Плюсы:
- Быстрее света (никакой загрузки в shell)
- Прозрачность (
chrubyпросто меняет переменные окружения) - “UNIX-way” (делает одну вещь и делает её хорошо)
👎 Минусы:
- Нет авто-переключения (нужен
auto.shскрипт для.ruby-version) - Ноль фич (хотите gemset’ы? Пишите свои скрипты)
🔥 Для фанатов контроля:
# Вручную переключаемся
chruby 3.1.0
# Или через файл
echo "3.1.0" > .ruby-version
🧪 Сравнение в бою
| Критерий | RVM | rbenv | chruby |
|---|---|---|---|
| Скорость | 🐢 | 🐇 | ⚡ |
| Gemset’ы | ✅ Встроенные | ❌ Требует Bundler | ❌ Нет |
| Автопереключение | ✅ | ✅ | ❌ (только с плагинами) |
| Влияние на shell | 🔥 Переписывает | 🔄 Минимальное | � Почти нулевое |
| Сложность отладки | 😱 | 😊 | 😎 |
💡 Какой выбрать?
- Для новичков:
rbenv— баланс простоты и функциональности - Для энтерпрайза:
RVM— если нужны изолированные gemset’ы - Для минималистов:
chruby— когда хочется контроля и скорости
Лично мой стек:
# На работе (много legacy-проектов)
RVM + .rvmrc (да, я живу опасно)
# На личном MacBook
chruby + ruby-install + direnv
# На серверах
rbenv (потому что "меньше магии — крепче сон")
💥 Главная боль всех менеджеров
Docker.
Когда вы собираете образ, все эти менеджеры становятся избыточными. Лучшая практика:
FROM ruby:3.2.2-alpine # ← Вот и весь ваш менеджер
WORKDIR /app
COPY Gemfile* .
RUN bundle install
Но локально без них всё равно никуда.
🎤 Что сказать на собеседовании
— Как вы управляете версиями Ruby в проекте?
— Мы используем rbenv с ruby-build для локальной разработки и фиксируем версию в Dockerfile для прода. Для gemset’ов полагаемся на Bundler — это даёт предсказуемость и в dev, и в prod.
🧾 Вывод
Выбор менеджера — как выбор текстового редактора:
- RVM — это как IDE: мощно, но тяжело
- rbenv — VS Code: баланс функций и простоты
- chruby — Vim: минимализм для тех, кто знает, что делает