Установить ruby ​​2.0 без ruby-switch?

23

Я нахожу задачу установки ruby ​​2.0 на последнюю Ubuntu 14.04 довольно разочаровывающей. Я знаю, что могу отказаться от пакетов и установить их из исходного кода - но я бы предпочел установить пакет - если это возможно.

Я нашел этот вопрос / ответ о ruby ​​13.10 - который выглядел так, как я хотел.

Как установить ruby?

К сожалению, стратегия не представляется жизнеспособной - пакет ruby-switch был удален в 14.04.

http://www.ubuntuupdates.org/package/core/trusty/universe/base/ruby-switch

Удаление пакета указывает на ошибку, которая для меня выглядит совершенно не связанной.

Я удивлен, почему установка ruby2.0 с помощью apt-get устанавливает ruby1.9 и делает его интерпретатором ruby ​​по умолчанию. Я получаю двоичный файл ruby2.0 - но сценарии (которые зависят от интерпретатора 2.0 при выполнении ruby) не поднимают его. Кроме того, когда я использую gem et. и др. установить пакеты ruby ​​- похоже, они установлены для ruby1.9, а не 2.0. Очень неудовлетворительно.

Кто-нибудь может подсказать, как наиболее просто установить ruby ​​2.0 в качестве стандартного интерпретатора ruby? Как я могу переключиться с ruby ​​1.9 на 2.0 без ruby-switch?

aSteve
источник

Ответы:

29

Для 14.04 я нашел следующие PPA, которые идут с Ruby 2.x

  • Добавляет Ruby 2.1 в Ubuntu 14.04

    sudo add-apt-repository ppa:brightbox/ruby-ng
    

Я также нашел в GoRails набор инструкций по установке Ruby на 14.04, но я предполагаю, что поскольку они длинные, вы бы хотели вместо этого PPA.

  • Добавляет Ruby 1.9, 2.0 или 2.1 в Ubuntu 14.04

    sudo add-apt-repository ppa:brightbox/ruby-ng-experimental
    

После добавления одного из них просто:

sudo apt-get update
sudo apt-get install ruby2.1 # In the case you want 2.1
Луис Альварадо
источник
6
Действительно ли необходимо добавить «Личный архив пакетов» для установки Ruby 2.0 в Ubuntu 14.04 - учитывая, что есть пакет для «Ruby2.0», доступный без?
aSteve
1
Вы просили самый простой способ. Это будет так, по крайней мере до тех пор, пока официальная версия Ruby 2.x не появится в Центре программного обеспечения или пока версия Ruby 2.0.x не обновится до фактического номера, а не будет соответствовать полученной вами ошибке.
Луис Альварадо
Хм ... разве ubuntuupdates.org/package/core/trusty/main/base/ruby2.0 не предполагает, что 2.0 уже включен в "основной" репозиторий?
aSteve
3
Да, но, как вы упомянули, это не ветка 2.x, а 1.9. Поэтому они должны это исправить.
Луис Альварадо
2
Похоже, что интерпретаторы 2.0 и 1.9 находятся в главном репозитории (со странной зависимостью), но ruby-switch был удален по ложной причине.
aSteve
8

Debian-версия Ruby не поддерживает несколько установок ruby ​​в одной системе. Debian устарел пакет, а Ubuntu просто удалил его из репозиториев. Вы должны использовать rbenvдля переключения между различными версиями ruby. Это рекомендуемый способ, описанный в описании пакета ruby-switch, и этот метод был обсужден в баге 737782 как предпочтительный, поскольку сказано, что в репозиториях должно быть не более одной версии ruby.

Ruby 2.0 устанавливается по умолчанию при установке ruby2.0пакета, и никаких других действий не требуется. Если пакет rubyбыл установлен, рекомендуется удалить его. Вы должны иметь бинарный файл /usr/bin/ruby2.0в вашей системе.

Braiam
источник
2
Хммм ... Когда я установил пакет ruby2.0, я получил исполняемый файл ruby2.0 и исполняемый файл ruby ​​1.9. При взаимодействии с гемом ruby1.9, похоже, принимался за системную версию ruby. При дальнейшем исследовании я обнаружил, что сценарии (хотя и утверждают, что им нужен ruby ​​2.0) на самом деле работают нормально с ruby ​​1.9 - поэтому я отказался от пакета ruby2.0. Я хотел только одну версию ruby ​​- то есть runy 2.0 - но пакеты ubuntu 14.04, похоже, не позволяли этого.
aSteve
@aSteve в Debian У меня, похоже, нет этой проблемы, через Ubuntu этот метод используется. Если хотите, попробуйте создать виртуальную среду для ruby ​​2.0 с помощью rbenv, просто чтобы быть в безопасности.
Брайам
2
Я определенно вижу это, и это не имеет смысла. на apt-get install ruby2.0 Я получаю: Будут установлены следующие НОВЫЕ пакеты: libjs-jquery libruby1.9.1 libruby2.0 ruby ​​ruby1.9.1 ruby2.0 rubygems-интеграция
Джош Нанкин
5
только что увидел blog.costan.us/2014/04/restoring-ruby-20-on-ubuntu-1404.html
Джош Нанкин
1
@jla Нет, на самом деле Debian предпочитает не поддерживать несколько версий Ruby , как вы можете видеть в журнале изменений . Debian говорит, что будет поддерживать только одну версию, и инструменты для переключения версий каким-то образом не работают, это более или менее ситуация в Debian. Ubuntu решила не делать скачок на 2.0 в то время.
Брайам
8
sudo apt-get install ruby2.0
sudo rm /usr/bin/ruby && sudo ln -s /usr/bin/ruby2.0 /usr/bin/ruby
sudo rm -fr /usr/bin/gem && sudo ln -s /usr/bin/gem2.0 /usr/bin/gem
rjspotter
источник
Вы также ln -fsможете форсировать обновление и избегать использования всегда страшногоrm -rf
njzk2
5

Если вы хотите переключаться между рубинами, я рекомендую использовать rvm ( https://rvm.io ). Это менеджер пакетов, и он позволяет вам устанавливать множество различных рубинов (не только Matz) на одном компьютере, локально для пользователя или глобально для всех пользователей.

Я знаю, что вы попросили «пакет», так что, возможно, это не сработает для вас. Но я подумал, что это может помочь, если это ваша машина для разработки.

Преимущество такого способа состоит в том, что вы можете установить один набор гемов для 2.1.1 и другие для 2.0 или 1.9.3 и т. Д. Он также позволяет тестировать jruby, rubinius и т. Д., Не привязывая вашу систему к одному.

Я не использую его в производстве, но, видимо, он подходит для этого, а также для разработки.

Вот быстрый старт: https://rvm.io/rvm/install

Луис
источник
1

Позднее в игре, но я думаю, что, возможно, более полное решение, чем жесткие кодовые ссылки, - это использование update-alternatives, размещенное здесь подробно, на случай, если другие будут укушены тем же разочарованием и захотят более нативное решение. Это обрабатывает все двоичные файлы и справочные страницы, предварительно удаляя ссылки во избежание конфликтов.

Предостережения:

  • Я думаю, что это нужно будет выполнить повторно, если / когда одна из версий ruby ​​будет обновлена.
  • Я не гуру, update-alternativesтак что, возможно, это излишне и / или сделано глупо.

Сценарий (я назвал fix-ruby-alternatives.sh):

#!/bin/bash

# Script to insert all potentially alternative-able files within ruby versioned packages
# Bill Evans ("r2evans")
# April 19, 2015

BIN=/usr/bin
MAN=/usr/share/man/man1
MASTER="ruby"
SLAVES=( gem irb rdoc testrb rake erb ri )
VERSIONS=( 1.9.1 2.0 )

DRYRUN="yes"
[[ "$1" = "-y" ]] && unset DRYRUN

PRI=0
for ver in ${VERSIONS[@]} ; do
    PRI=$(( ${PRI} + 1 ))
    REMCMD="update-alternatives --remove ${MASTER} ${BIN}/${MASTER}${ver}"
    CMD="update-alternatives --install ${BIN}/${MASTER} ${MASTER} ${BIN}/${MASTER}${ver} ${PRI}"
    if test -f "${MAN}/${MASTER}${ver}.1.gz" ; then
        CMD="${CMD}    --slave ${MAN}/${MASTER}.1.gz ${MASTER}.1.gz ${MAN}/${MASTER}${ver}.1.gz"
    else
        echo "#  no ${MAN}/${MASTER}${ver}.1.gz" > /dev/stderr
    fi
    for sl in ${SLAVES[@]} ; do
        if test -f "${BIN}/${sl}${ver}" ; then
            CMD="${CMD}    --slave ${BIN}/${sl} ${sl} ${BIN}/${sl}${ver}"
        else
            CMD="${CMD}    --slave ${BIN}/${sl} ${sl} /dev/null"
            echo "#  no ${BIN}/${sl}${ver}" > /dev/stderr
        fi
        if test -f "${MAN}/${sl}${ver}.1.gz" ; then
            CMD="${CMD}    --slave ${MAN}/${sl}.1.gz ${sl}.1.gz ${MAN}/${sl}${ver}.1.gz"
        else
            CMD="${CMD}    --slave ${MAN}/${sl}.1.gz ${sl}.1.gz /dev/null"
            echo "#  no ${MAN}/${sl}${ver}.1.gz" > /dev/stderr
        fi
    done

    if [[ -n ${DRYRUN} ]]; then
        echo -e ${REMCMD}
        echo -e ${CMD} | sed -e 's/\s* --slave/\n    --slave/g'
        echo "# Consider: update-alternatives --auto ruby"
    else
        ${REMCMD}
        ${CMD}
        echo "# Consider: update-alternatives --auto ruby"
    fi
done
r2evans
источник
IIRC можно просто позвонить ${RECMD}и ${CMD}без кавычек вместо использования eval. На другом примечании: я буду брать "клудглы". :)
Муру
Правда ... это был почти поспешный взлом. Исправлена. Спасибо :-)
r2evans