Ruby в Debian
Решил поэкспериментировать с Ruby 1.9.2, установил через aptitude и столкнулся с
тем, что команда ruby все так же указывала на запуск руби версии 1.8.7.
Задумался, а ведь правда, каким образом можно одновременно использовать различные версии одной и той же программы?
RVM
На помощь приходит RVM (Ruby Version Manager). Перед его установкой необходимо удалить ruby из системы.
$ sudo aptitude purge ruby ruby1.8 rubygems
$ sudo aptitude install bash curl git-core
$ sudo aptitude install build-essential zlib1g-dev libssl-dev libreadline5-dev libxml2-dev libsqlite3-dev
Устанавливаем сам RVM:
$ bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
Установка осуществляется в домашнюю папку пользователя, поэтому запуск, установка будет осуществляться от имени текущего пользователя.
Чуть раньше по завершении данной команды требовалось добавлять определенную строку в файл
~/.bashrc, теперь этого делать не нужно, она прописывается автоматически.
Вполне вероятно, что при использовании bash при запуске оболочки будут появляться
предупреждения о наличии ошибок в файле ~/.rvm/scripts/cd. Можно, конечно на них не
обращать внимания, но я решил разобраться. Оказалось, что в данном файле достаточно в
строках 24 и 34 в объявление функции добавить ключевое слово function.
Было
cd()
Стало
function cd()
Теперь заставляем bash перечитать файлы конфигурации и проверяем, все ли установилось правильно:
$ source ~/.bashrc
$ rvm notes
Если все прошло нормально, то на экране увидим информацию по зависимостям данной программы.
Настала пора устанавливать ruby. Посмотрим список доступных интерпретаторов:
$ rvm list known
И теперь устанавливаем требуемую версию:
$ rvm install 1.8.7
Придется немного подождать, пока интерпретатор собирается. После чего указываем системе на его использование и проверяем, все ли установилось правильно:
$ rvm use 1.8.7
$ ruby -v
Теперь аналогично можно установить другую версию ruby, и в различных проектах использовать требуемую версию. Для того, чтобы в системе постоянно использовалась определенная версия ruby необходимо дать команду:
$ rvm --default use 1.8.7
Gem
Для каждой версии ruby создается своя коллекция gem. Что довольно удобно. К тому же есть возможность создавать свои собственные коллекции и использовать их для определенного круга задач. Так как ruby мы устанавливали от имени пользователя, то и gem необходимо устанавливать так же, например:
$ gem install jekyll kramdown serve thin
Переключение коллекции осуществляется автоматически при изменении используемой версии ruby.
Для управления коллекциями используется команда gemset. Создадим коллекцию и будем ее
использовать:
$ rvm gemset create bestgems
$ rvm gemset use bestgems
Теперь устанавливаем нужные нам gem (коллекция создается по умолчанию пустой). И для того, чтобы определенная коллекция использовалась по умолчанию, ее необходимо указать при определении версии ruby:
$ rvm use 1.9.2-head@bestgems --default
Для того, чтобы gem устанавливались без документации (к примеру, на сервере она совершенно
не нужна), достаточно в файл ~/.gemrc добавить строки:
install: --no-rdoc --no-ri
update: --no-rdoc --no-ri
Преимущества
В Debian ruby прекрасно ставится из репозитория, однако в дальнейшем обновлять версию ruby возможно только при обновлении соответствующего пакета, что происходит довольно редко и с большими задержками. Использование команды обновления просто заблокировано:
$ sudo gem update --system
При попытке ее использования мы получим довольно объемное описание, почему использование данной команды запрещено.
Если же использовать RVM, то таких проблем не возникает.
К тому же, установка по умолчанию производиться в домашнюю папку пользователя. И все программы, gems доступны только ему. Любой пользователь системы может иметь свой набор инструментов, который может понадобиться именно ему. А при необходимости RVM можно установить и как системный менеджер.
RVM позволяет очень просто создавать собственные коллекции gem, использовать для каждой отдельной задачи свой набор и свою версию ruby. Гибкость разработки просто невероятная!
Вы все еще не используете RVM? Тогда мы идем к Вам!!!