Zainstalować Ruby 2.0 bez przełącznika ruby?

23

Zadanie instalowania Ruby 2.0 na najnowszym Ubuntu 14.04 wydaje mi się dość frustrujące. Wiem, że mogłem zrezygnować z pakietów i zainstalować je ze źródła - ale zdecydowanie wolałbym zainstalować pakiet - jeśli to możliwe.

Znalazłem to pytanie / odpowiedź na temat ruby ​​13.10 - które wyglądało tak, jak chciałem.

Jak zainstalować Ruby?

Niestety strategia nie wydaje się realna - pakiet ruby-switch został usunięty w 14.04.

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

Usunięcie pakietu odnosi się do błędu, który wydaje mi się zupełnie niezwiązany.

Jestem zaskoczony, dlaczego instalowanie ruby2.0 za pomocą apt-get instaluje ruby1.9 i sprawia, że ​​jest to domyślny interpreter ruby. Dostaję plik binarny ruby2.0 - ale skrypty (które zależą od interpretera 2.0 podczas wykonywania ruby) nie biorą go. Ponadto, kiedy używam gem et. glin. instalować pakiety Ruby - wydaje się, że są one instalowane dla Ruby 1.9, a nie 2.0. Bardzo niezadowalające.

Czy ktoś może podpowiedzieć, jak najprościej zainstalować Ruby 2.0 jako standardowy interpreter ruby? Jak mam się zmienić z Ruby 1.9 na 2.0 bez Ruby-Switch?

aSteve
źródło

Odpowiedzi:

29

Na 14.04 znalazłem następujące PPA, które są dostarczane z Ruby 2.x

  • Dodaje Ruby 2.1 do Ubuntu 14.04

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

Znalazłem również w GoRails zestaw instrukcji do zainstalowania Ruby w dniu 14.04, ale zgaduję, że ponieważ są one długie, zamiast tego chciałbyś PPA.

  • Dodaje Ruby 1.9, 2.0 lub 2.1 do Ubuntu 14.04

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

Po dodaniu jednego z nich po prostu:

sudo apt-get update
sudo apt-get install ruby2.1 # In the case you want 2.1
Luis Alvarado
źródło
6
Czy naprawdę konieczne jest dodanie „Personal Package Archive”, aby zainstalować Ruby 2.0 w Ubuntu 14.04 - biorąc pod uwagę, że dostępny jest pakiet dla „Ruby2.0”?
aSteve,
1
Poprosiłeś o najprostszy sposób. Tak by było, przynajmniej do czasu, gdy oficjalna wersja Ruby 2.x pojawi się w Centrum oprogramowania lub dopóki wersja Ruby 2.0.x nie zaktualizuje się do rzeczywistej liczby, którą jest, a nie podoba ci się błąd.
Luis Alvarado,
Hmm ... czy ubuntuupdates.org/package/core/trusty/main/base/ruby2.0 nie sugeruje, że 2.0 jest już zawarte w „głównym” repozytorium?
aSteve,
3
Tak, ale jak wspomniałeś, nie jest to gałąź 2.x, ale 1.9. Więc powinni to naprawić.
Luis Alvarado,
2
Wygląda na to, że tłumacze 2.0 i 1.9 znajdują się w głównym repozytorium (z dziwną zależnością) - ale przełącznik ruby ​​został usunięty z fałszywego powodu.
aSteve
8

Debianowa wersja Ruby nie obsługuje kilku instalacji Ruby w tym samym systemie. Debian zdezaktualizował pakiet, a Ubuntu po prostu usunął go z repozytoriów. Powinieneś używać rbenvdo przełączania różnych wersji ruby. Jest to zalecany sposób w opisie pakietu przełączania ruby ​​i była to metoda, która została omówiona w błędzie 737782 jako preferowana, ponieważ mówi się, że w repozytoriach nie powinna znajdować się więcej niż jedna wersja ruby.

Ruby 2.0 jest instalowany domyślnie podczas instalacji ruby2.0pakietu i nie jest wymagane żadne inne działanie. Jeśli pakiet rubyzostał zainstalowany, zaleca się jego usunięcie. Plik binarny powinien być /usr/bin/ruby2.0dostępny w systemie.

Braiam
źródło
2
Hmmm ... Kiedy zainstalowałem pakiet ruby2.0, otrzymałem plik wykonywalny ruby2.0 i plik wykonywalny ruby ​​1.9. Podczas interakcji z klejnotem ruby1.9 wydawało się być wersją systemową ruby. Podczas dalszych badań odkryłem, że skrypty (choć twierdzą, że potrzebują Ruby 2.0) faktycznie działają dobrze z Ruby 1.9 - więc zrezygnowałem z pakietu Ruby2.0. Chciałem tylko jednej wersji ruby ​​- tj. Zrujnowanego 2.0 - ale pakiety Ubuntu 14.04 nie pozwalały na to.
aSteve
@ aSteve w Debianie Wydaje mi się, że nie mam tego problemu, ponieważ Ubuntu używa tej metody. Jeśli chcesz, spróbuj utworzyć wirtualne środowisko dla Ruby 2.0 zamiast rbenv, aby być bezpiecznym.
Braiam
2
zdecydowanie to widzę i to nie ma sensu. na apt-get install ruby2.0 Dostaję: Zainstalowane zostaną następujące NOWE pakiety: libjs-jquery libruby1.9.1 libruby2.0 ruby ​​ruby1.9.1 integracja rubygemów ruby2.0
Josh Nankin
1
@jla nie, w rzeczywistości Debian nie obsługuje kilku wersji Ruby , jak widać w dzienniku zmian . Debian mówi, że będzie obsługiwał tylko jedną wersję, a narzędzia do zmiany wersji są w jakiś sposób zepsute, tak mniej więcej jest w Debianie. Ubuntu nie zdecydowało się wówczas na skok w kierunku 2.0.
Braiam
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
źródło
możesz także ln -fswymusić aktualizację i unikać używania zawsze przerażającegorm -rf
njzk2
5

Jeśli chcesz przełączać się między rubinami, polecam użycie rvm ( https://rvm.io ). Jest to menedżer pakietów i pozwala instalować wiele różnych rubinów (nie tylko Matza) na jednym komputerze, lokalnym dla użytkownika lub globalnie dla wszystkich użytkowników.

Wiem, że poprosiłeś o „paczkę”, więc może to nie zadziała. Ale pomyślałem, że to może pomóc, jeśli to twoja maszyna programistyczna.

Zaletą robienia tego w ten sposób jest to, że możesz zainstalować jeden zestaw gemów dla 2.1.1 i inne dla 2.0 lub 1.9.3, itp. Pozwala także testować jruby, rubinius itp. Bez konieczności przypisywania systemu do jednego.

Nie używam go do produkcji, ale najwyraźniej nadaje się do tego, a także do rozwoju.

Oto szybki start: https://rvm.io/rvm/install

Louis
źródło
1

Późno w grze, ale myślę, że bardziej kompletne rozwiązanie niż dowiązania symboliczne na update-alternativesstałe to takie użycie , zamieszczone tutaj werbalnie, na wypadek, gdyby inni ulegli tej samej frustracji i chcieliby rozwiązania bardziej natywnego. To obsługuje wszystkie pliki binarne i strony podręcznika, zapobiegając najpierw usuwaniu referencji, aby uniknąć konfliktów.

Ostrzeżenia:

  • Myślę, że będzie to wymagało ponownego uruchomienia, jeśli / kiedy jedna z wersji ruby ​​zostanie zaktualizowana.
  • Nie jestem guru, update-alternativeswięc możliwe, że to przesada i / lub zrobione kludgingly.

Skrypt (nazwałem 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
źródło
IIRC możesz po prostu zadzwonić ${RECMD}i ${CMD}bez cudzysłowów, zamiast używać eval. Inna uwaga: pożyczę „kludgingly”. :)
muru
To prawda ... to był szybki pośpiech. Naprawiony. Dzięki :-)
r2evans 19.04.15