Ruby — штука красивая. Код пишется как стихи, баги лезут как тараканы, а документация — как всегда, либо божественная, либо устаревшая на пять лет. На Ubuntu 20.04 его можно впендюрить тремя способами: по-быстрому через apt, через лёгкий и понятный rbenv или через монстра RVM, который тащит за собой полмира.

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

Вариант 1. Быстрый и тупой: apt

Хочешь просто чтобы работало? Плевать на последние версии? Тогда так:

sudo apt update
sudo apt install ruby-full
ruby --version

Да, всё.

Вариант 2. Лёгкий и гибкий: rbenv

Если тебе надо гонять несколько версий Ruby и не лезть в ад зависимостей — бери rbenv. Он не пытается быть всем на свете, делает одну вещь и делает её нормально.

Ставим зависимости, чтобы потом не было «undefined reference» и прочей фигни при компиляции:

sudo apt update
sudo apt install git curl autoconf bison build-essential \
  libssl-dev libyaml-dev libreadline6-dev zlib1g-dev \
  libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev

Дальше — магия:

curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash

Теперь добавляем rbenv в PATH (Bash или Zsh — выбирай свой яд):

# Bash echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
# Zsh echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc

Проверяем, что всё живо:

rbenv -v

Смотрим, что можно поставить:

rbenv install -l

Например, Ruby 2.7.1:

rbenv install 2.7.1
rbenv global 2.7.1

Всё. rbenv кладёт шельмовые «shims» в PATH, и Ruby выбирается так, как ты сказал:

  • Глобальноrbenv global X.Y.Z
  • Локально в проектеrbenv local X.Y.Z
  • На время сессииrbenv shell X.Y.Z

Главное — забудь про sudo gem install, если юзаешь rbenv. Всё ставится в домашнюю папку.

Вариант 3. Толстый и прожорливый: RVM

Если тебе мало просто переключения версий и хочется ещё 100500 функций, бери RVM. Он тащит за собой тонну всего, зато умеет всё подряд.

Ставим зависимости:

sudo apt update
sudo apt install curl g++ gcc autoconf automake bison libc6-dev \
  libffi-dev libgdbm-dev libncurses5-dev libsqlite3-dev libtool \
  libyaml-dev make pkg-config sqlite3 zlib1g-dev libgmp-dev \
  libreadline-dev libssl-dev

Подписываемся на ключи:

curl -sSL https://rvm.io/mpapis.asc | gpg --import -
curl -sSL https://rvm.io/pkuczynski.asc | gpg --import -

Ставим RVM:

curl -sSL https://get.rvm.io | bash -s stable

Подгружаем окружение:

source ~/.rvm/scripts/rvm

Смотрим, что есть:

rvm list known

Ставим Ruby (по дефолту — последнюю):

rvm install ruby
rvm --default use ruby

Хочешь конкретную версию?

rvm install ruby-3.1.2
rvm --default use ruby-3.1.2

И да, RVM может жрать память и пакостить PATH. Но если у тебя десяток проектов на разных версиях и нужен полный контроль — оно того стоит.

Итог

  • Хочешь «поставил и забыл» — apt.
  • Хочешь минимум лишнего, максимум контроля над версиями — rbenv.
  • Хочешь all-inclusive и готов терпеть жир — RVM.