15 декабря 2009, 13:46

Одновременное использование двух версий руби на одной системе

Темы: ruby, ruby1.9, bash

Введение

Как молодой язык с неутверждённой спецификацией, руби переживает подростковую болезнь, через которую большинство известных языков уже прошли. Есть новая более быстрая версия, на которую уже стоит переходить, но уже много написано на предыдущей, и так боязно всё ломать...

Поэтому необходимо найти удобный для себя способ (а лучше несколько) чтобы начать использовать руби 1.9.

Постановка задачи

Сейчас практически панацеей для использования более одной версии руби является rvm. Очень удобно в использовании, полностью прозрачно, и позволяет иметь разные версии руби в разных окнах терминала.

Но недавно мне понадобилось скомпилировать wxRuby под свою систему (kubuntu 9.10 amd64), и rvm не справилась с этой задачей. По какой-то причине в момент компилляции были недоступны заголовки руби. Поэтому я решил поставить две версии руби более явно: одна системная (1.8.7) и одна в папке /opt (1.9.1). Причем все команды, связанные с руби 1.9 будут вызываться с суффиксом: ruby1.9, irb1.9, gem1.9, rake1.9.

Возможно, подобных инструкций уже полно, но мне будет удобнее, если я точно буду знать, где находится одна из них :) При всём этом, конечно, rvm продолжает работать. Мы никак ему не помешаем.

Решение

Сначала нужно поставить новый readline. Без него, когда мы будем использовать irb1.9, мы не сможем наслаждаться доступом к истории с помощью стрелок вверх-вниз и перемещаться по введенному тексту с помощью стрелок в стороны.

sudo apt-get install libreadline5-dev

Теперь хорошо бы вписать пути в наше окружение. В конце ~/.bashrc добавим:

export PATH=$PATH:/opt/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/lib

Теперь следует скачать и разархивировать последнюю версию руби. Зайдя в папку скомпилировать и установить:

./configure --prefix=/opt --enable-shared --program-suffix=1.9
make
sudo make install

Теперь у нас есть две отдельных установки руби и сопутствующих инструментов. Единственное, что обе установки используют общие конфигурационные файлы: ~/.gemrc, ~/.irbrc и т.п., что вполне удобно. Также для обеих систем общей директорией джемов будет ~/.gem, куда будут устанавливаться библиотеки, запусти мы их установку без sudo (в случае с sudo, конечно же, директории установки различаются).

Так же я не нашёл быстрого способа добавить /opt/bin в переменную PATH для sudo. Поэтому в таких случаях пока использую полный путь. Например, первая команда, которую следует выполнить:

sudo /opt/bin/gem1.9 update --system

Потому что в пакете с руби идёт версия 1.3.1, а настоящие пацаны уже во всю используют 1.3.5.

Материалы для самостоятельного изучения

  1. Всё об установке нескольких версий руби на одной системе
  2. Проект «Используй руби 1.9 или вали!»

Комментарии:

A.I. — 15 декабря 2009, 17:42

А почему просто не поставить пакеты ruby1.8 и ruby1.9.1 (если это Ubuntu).

Sergey Kruk — 15 декабря 2009, 18:22

В этом случае вы ограничены теми версиями, которые распространяется с aptitude и только.

A.I. — 15 декабря 2009, 19:07

Ну так что мешает собрать пакет и выложить, например, в Ubuntu on Rails PPA? Каждый раз делать велосипед — неправильно. А компилить файлы — моветон, можно повредить систему, да и вообще, какой-то Windows-way — неконтролируемо кидать файлы в системные папки.

Sergey Kruk — 15 декабря 2009, 20:04

Для разработчика компилировать свежие, с пылу, с жару из trunk'a версии разных библиотек -- это вполне в порядке вещей. Если нужно убедиться, что выход новой версии библиотеки, от которой что-то зависит, ничего не сломает, до того как она попадёт в aptitude. Так же вполне, я считаю, похвально поддерживать несколько старых ключевых версий разных пакетов. Для этого и существует папка /opt, куда и следует собирать из исходников.

Sergey Avseyev — 20 декабря 2009, 19:00

А еще можно настроить механизм альтернатив который широко используется в Ubuntu и Debian.

тогда переключение на другую версию можно будет делать с помощью
$ sudo update-alternatives --config ruby

Вот тут пример конфигурации http://avsej.net/2009/12/01/update-alternatives-for-ruby-in-ubuntu

И.Ш. — 26 февраля 2010, 13:46

Дык совсем недавно в Райан ведал в своем касте 200м о RVM (ruby version manager) устанавливать можно хоть сколько угодно руби версий, на них устанавливать удобные джемы, а переключением между ними одной командой.

И.Ш. — 26 февраля 2010, 13:48

Извиняюсь, что не приложил сразу: http://rvm.beginrescueend.com/
Посмотрел дату поста и включил голову)

Sergey Kruk — 27 февраля 2010, 10:20

Написал эту статью после того, как не смог скомпилировать wxruby2 из исходников под rvm ruby1.9. Может, конечно, и через rvm как-то можно было.

Оставить свой комментарий: