Комфортное управление пакетами в Ruby

RVM — Ruby Version Manager (менеджер управления пакетами в ruby) сослужит хорошую службу в тех частых ситуациях, когда вам может потребоваться запуск нескольких версий ruby на одной машине или же нескольких проектов с разными наборами gem'ов для них. Чем-то напоминает virtualenv, если сравнивать с аналогичным приложением для python.

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

Что такое gem?

Gem (драгоценный камень, жемчужина) — пакет ruby, предоставляющий какую-то функциональность. Например, библиотека redcarpet, доступная в виде gem'а, обеспечивает поддержку markdown.

Что такое gemset?

Gemset (set: набор, комплект) — набор gem'ов.

Установка RVM

$ \curl -L https://get.rvm.io | bash
Downloading RVM branch master
% Total    % Received % Xferd  Average Speed
                              Dload  Upload
100   124  100   124    0     0    107
100 1084k  100 1084k    0     0   234k
* To start using RVM you need to run
`source /home/user/.rvm/scripts/rvm`

Перезапускаем консоль и убеждаемся в том, что rvm был успешно установлен:

$ rvm -v
rvm 1.23.13

$ rvm get stable --auto-dotfiles

Дополним переменную PATH, дабы указать путь к директории rvm. Запись нужно сделать в .bashrc или .zshenv.

# .bashrc
export PATH="$PATH:$HOME/.rvm/bin"

Дальше любопытно было бы просмотреть список доступных для установки и уже установленных пакетов ruby.

$ rvm list known # просмотреть все доступные для установки версии Ruby
$ rvm list       # все установленные версии Ruby
=* ruby-1.9.3-p448 [ x86_64 ]
# => - current - текущая версия
# =* - current && default - текущая и спользуется по-умолчанию
#  * - default - используемая по-умолчанию версия

Использование разных версий ruby и gemset'ы

$ source ~/.rvm/scripts/rvm # активировать rvm
$ rvm install 1.9.3 # установить несколько версий ruby
$ rvm install 2.0.0
$ rvm use ruby-2.0.0-p247 --default # переключиться на ruby 2 и использовать v2 по-умолчанию
$ rvm list
   ruby-1.9.3-p448 [ x86_64 ]
=* ruby-2.0.0-p247 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

Для примера создадим gemset jekyll, где будут собраны все нужные одноимённому генератору статических страниц gem'ы.

$ source ~/.rvm/scripts/rvm # «включаем» rvm
$ rvm use 1.9.3@jekyll --create # создать gemset
$ rvm use 1.9.3@jekyll --default # выбирать его по-умолчанию
$ gem install jekyll jekyll-tagging i18n # установка gem'ов
$ gem list # просмотр установленных в выбранном gemset'е gem'ов
i18n (0.6.5)
jekyll (1.2.1)
jekyll-tagging (0.5.0)
liquid (2.5.3)
maruku (0.7.0)

Gemset'ы создаются для определённой версии ruby. Так, при переключении с одной версии на другую вы будете всегда видеть разный набор gemset'ов: отображаются они также лишь для своей версии.

$ rvm gemset list # набор gemset'ов для ruby2

gemsets for ruby-2.0.0-p247
   (default)
=> example
   global

$ cd workspace/jekyll # переход в директорию проекта, где используется ruby1.9
$ rvm gemset list     # набор gemset'ов для ruby1.9

gemsets for ruby-1.9.3-p448
   (default)
   global
=> jekyll

Но здесь мы забежали чуть вперёд. Дело в том, что при переходе в директорию проекта, автоматически меняется версия ruby и набор gemset'ов, о чём речь пойдёт чуть ниже.

Gemset'ы можно удалять(delete), очищать(), экспортировать(export) и импортировать(import) gem'ы из одного в gemset'a в другой. Наиболее часто используемые действия отражены в данной ниже таблице.

командаописание
rvm gemset createсоздать новый gemset
rvm gemset export new.gemsэкспорт списка gem'ов в файл new.gems
rvm gemset import new.gemsимпорт в текущий gemset списка gem'ов из файла new.gems
rvm gemset deleteудалить gemset
rvm gemset emptyочистить gemset
rvm gemset delete example --forceполностью удалить gemset example
rvmresetперезагрузка RVM
rvm uninstallудалить версию Ruby, оставить исходники
rvm implodeполностью удалить RVM!
rvm list knownполучить список всех версий ruby доступных для установки
rvm listотобразить список установленных версий ruby
rvm gemset listпросмотреть список gemset'ов в выбранной версии ruby
rvm install 1.9.3установить ruby версии 1.9.3
rvm remove 1.9.3удалить ruby версии 1.9.3
rvm use 1.9.3переключиться на ruby версии 1.9.3
rvm use 1.9.3@jekyll --defaultиспользовать версию ruby 1.9.3 c gemset jekyll по умолчанию
rvm use systemиспользовать системную версию ruby

Создание отдельного окружения для проекта

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

В примере выше мы создали gemset jekyll, который использует версию ruby 1.9.3 и собственный набор gem'ов. Теперь у нас имеется два пути для работы с ним.

Переключение между gemset'ами

Во-первых, можно переключаться между gemsets при необходимости.

$ rvm gemset use global
$ rvm gemset use jekyll

Окружение?

Но зачастую быстрее один раз внести необходимые настройки. Для этого следует создать два файла в каталоге с проектом: .ruby-gemset и .ruby-version, куда и поместить информацию об используемом в проекте gemset'е и версии ruby соответственно.

$ cat ~/workspace/jekyll/.ruby-gemset
jekyll

$ cat ~/workspace/jekyll/.ruby-version
ruby-1.9.3-p448

Теперь достаточно просто зайти в директорию проекта, и нужные нам параметры будут установлены автоматически.

$ cd workspace/jekyll
$ rvm list

=> ruby-1.9.3-p448 [ x86_64 ]
 * ruby-2.0.0-p247 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

То есть, если вы использовали версию ruby 2, после перехода в каталог с проектом, она автоматически изменится на версию, указанную в .ruby-version, что достаточно удобно.