Встановити ruby ​​2.0 без ruby-перемикача?


23

Мені здається, що завдання встановити ruby ​​2.0 на останню версію Ubuntu 14.04 досить неприємно. Я знаю, що я міг би відмовитись від пакетів та встановити з джерела, але я набагато краще встановити пакет - якщо це можливо.

Я знайшов це питання / відповідь про рубін 13.10 - яке виглядало так, як я хотів.

Як встановити рубін?

На жаль, стратегія не здається реальною - пакет рубінних комутаторів був видалений 14.04.

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

Видалення пакета посилається на помилку, яка, на мене, виглядає абсолютно не пов'язаною.

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

Чи може хтось запропонувати підказку щодо найпростішого способу встановлення ruby ​​2.0 як стандартного перекладача рубіну? Як я можу перейти з ruby ​​1.9 на 2.0 без ruby-перемикача?

Відповіді:


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
Ви просили найпростіший спосіб. Це було б, принаймні, доки в офіційному центрі програмного забезпечення не з’явиться офіційна версія 2.x Ruby або поки версія 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 знаходяться в основному сховищі (із дивною залежністю), але рубіт-комутатор видалено з помилкової причини.
aSteve

8

Debian версія Ruby не підтримує декілька рубінових установок в одній системі. Debian застарів пакет, а Ubuntu просто видалив його із сховищ. Ви повинні використовувати rbenvдля переключення між різними версіями рубіну. Це рекомендований опис пакета ruby-switch і був методом, який обговорювався в помилці 737782 як переважний, через те, що сказано, що у сховищах не повинно бути більше однієї версії ruby.

Ruby 2.0 встановлюється за замовчуванням під час встановлення ruby2.0пакету, і ніяких інших дій не потрібно. Якщо пакет rubyбув встановлений, рекомендується його видалити. У /usr/bin/ruby2.0вашій системі має бути доступний бінарний файл .


2
Гммм ... Коли я встановив пакет ruby2.0, я отримав виконуваний файл ruby2.0 та виконувану програму ruby ​​1.9. Під час взаємодії з дорогоцінним каменем ruby1.9, здавалося, вважається версією системного ruby. Під час подальшого розслідування я виявив, що сценарії (хоча і стверджують, що потрібен ruby ​​2.0) насправді спрацьовують добре з ruby ​​1.9 - тому я відмовився від пакета ruby2.0. Я хотів лише однієї рубінової версії - тобто 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-інтеграція
Josh Nankin


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

Ви також 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, розміщене тут багатослівно, на випадок, якщо інших вкусить таке ж розчарування і хотілося б більш рідного рішення. Це обробляє всі бінарні файли та підручні сторінки, попередньо видаляючи посилання спочатку, щоб уникнути конфліктів.

Застереження:

  • Я думаю, що це потрібно буде повторити, якщо / коли буде оновлена ​​одна з версій рубіну.
  • Я не гуру, 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

IIRC ви можете просто зателефонувати ${RECMD}і ${CMD}без лапок, а не використовувати eval. Ще одна примітка: я буду позичати "дивовижно". :)
muru

Правда ... це був майже поспішний злом. Виправлено. Дякую :-)
r2evans
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.