Ruby 2.0 ohne ruby-switch installieren?

23

Ich finde die Aufgabe, Ruby 2.0 auf dem neuesten Ubuntu 14.04 zu installieren, ziemlich frustrierend. Mir ist bewusst, dass ich auf die Pakete verzichten und von der Quelle installieren könnte - aber ich würde weitaus lieber ein Paket installieren - wenn das möglich ist.

Ich fand diese Frage / Antwort über Ruby am 13.10. - was so aussah, wie ich es wollte.

Wie installiere ich ruby?

Leider scheint die Strategie nicht umsetzbar zu sein - das Paket ruby-switch wurde im 14.04 gelöscht.

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

Das Löschen des Pakets verweist auf einen Fehler , der für mich völlig unabhängig aussieht.

Ich wundere mich, warum die Installation von ruby2.0 mit apt-get ruby1.9 installiert und es zum Standard-Ruby-Interpreter macht. Ich bekomme eine Ruby2.0-Binärdatei - aber Skripte (die bei der Ausführung von Ruby von einem 2.0-Interpreter abhängen) nehmen sie nicht auf. Wenn ich gem et. al. Installation von Ruby-Paketen - Diese scheinen für Ruby1.9 und nicht für 2.0 installiert zu sein. Sehr unbefriedigend.

Kann jemand einen Hinweis geben, wie Ruby 2.0 am einfachsten als Standard-Ruby-Interpreter installiert werden kann? Wie soll ich ohne Ruby-Switch von Ruby 1.9 auf 2.0 umsteigen?

aSteve
quelle

Antworten:

29

Für 14.04 habe ich die folgenden PPAs gefunden, die mit Ruby 2.x geliefert werden

  • Fügt Ruby 2.1 zu Ubuntu 14.04 hinzu

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

Ich habe auch in GoRails eine Reihe von Anweisungen gefunden , um Ruby auf 14.04 zu installieren, aber ich vermute, da sie lang sind, möchten Sie stattdessen eine PPA.

  • Fügt Ubuntu 14.04 Ruby 1.9, 2.0 oder 2.1 hinzu

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

Nachdem Sie einen von ihnen hinzugefügt haben, gehen Sie einfach wie folgt vor:

sudo apt-get update
sudo apt-get install ruby2.1 # In the case you want 2.1
Luis Alvarado
quelle
6
Ist es wirklich notwendig, ein 'Persönliches Paketarchiv' hinzuzufügen, um Ruby 2.0 in Ubuntu 14.04 zu installieren - vorausgesetzt, es gibt ein Paket für "Ruby2.0" ohne dieses?
aSteve
1
Sie haben nach dem einfachsten Weg gefragt. Dies ist zumindest so lange der Fall, bis die offizielle 2.x-Version von Ruby im Software Center angezeigt wird oder bis die Version von Ruby 2.0.x auf die tatsächliche Nummer aktualisiert wird, die es ist, und nicht wie der Fehler, den Sie haben.
Luis Alvarado
Hmm ... schlägt ubuntuupdates.org/package/core/trusty/main/base/ruby2.0 nicht vor , dass 2.0 bereits im "Haupt" -Repository enthalten ist?
aSteve
3
Ja, aber wie Sie bereits erwähnt haben, ist es nicht der 2.x-Zweig, sondern der 1.9. Also sollten sie das beheben.
Luis Alvarado
2
Es sieht so aus, als ob sich die Interpreter 2.0 und 1.9 im Hauptrepository befinden (mit einer seltsamen Abhängigkeit) - aber Ruby-Switch wurde aus einem falschen Grund gelöscht.
22.
8

Die Debian-Version von Ruby unterstützt nicht mehrere Ruby-Installationen auf demselben System. Debian hat das Paket veraltet und Ubuntu hat es gerade aus den Repositories entfernt. Sie sollten verwenden rbenv, um zwischen verschiedenen Rubin-Versionen zu wechseln. Dies ist die empfohlene Methode in der Paketbeschreibung von ruby-switch und wurde im Fehler 737782 als bevorzugte Methode erörtert. Es wird angegeben, dass die Repositorys nicht mehr als eine Version von ruby ​​enthalten dürfen.

Ruby 2.0 wird standardmäßig bei der Installation des ruby2.0Pakets installiert , und es sind keine weiteren Aktionen erforderlich. Wenn das Paket rubyinstalliert wurde, wird empfohlen, es zu entfernen. Sie sollten die Binärdatei /usr/bin/ruby2.0auf Ihrem System verfügbar haben .

Braiam
quelle
2
Hmmm ... Als ich das ruby2.0-Paket installierte, bekam ich eine ausführbare ruby2.0-Datei und eine ausführbare ruby ​​1.9-Datei. Bei der Interaktion mit gem wurde ruby1.9 als Ruby-Version des Systems angenommen. Bei weiteren Untersuchungen stellte ich fest, dass die Skripte (obwohl sie angeblich Ruby 2.0 benötigen) mit Ruby 1.9 einwandfrei funktionieren - daher habe ich das Paket ruby2.0 aufgegeben. Ich wollte nur eine Ruby-Version, nämlich runy 2.0, aber die Ubuntu 14.04-Pakete schienen dies nicht zuzulassen.
aSteve
@aSteve in Debian Ich scheine dieses Problem nicht zu haben, durch Ubuntu wird diese Methode verwendet. Wenn Sie möchten, erstellen Sie stattdessen eine virtuelle Umgebung für Ruby 2.0 mit rbenv, um auf der sicheren Seite zu sein.
Braiam
2
Ich sehe das definitiv und es macht keinen Sinn. Bei apt-get install ruby2.0 bekomme ich: Die folgenden NEUEN Pakete werden installiert: libjs-jquery libruby1.9.1 libruby2.0 ruby ​​ruby1.9.1 ruby2.0 rubygems-integration
Josh Nankin
1
@jla Nein, tatsächlich hat Debian entschieden , mehrere Ruby-Versionen nicht zu unterstützen , wie Sie im Changelog sehen können . Debian sagt, dass es nur eine Version unterstützen wird und die Tools zum Wechseln der Versionen irgendwie kaputt sind, das ist mehr oder weniger die Situation in Debian. Ubuntu entschied sich damals, den Sprung für 2.0 nicht zu machen.
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
quelle
Sie können auch ln -fsdas Update erzwingen und die Verwendung der immer beängstigendrm -rf
njzk2
5

Wenn Sie zwischen Rubinen wechseln möchten, empfehle ich die Verwendung von rvm ( https://rvm.io ). Es ist ein Paketmanager, mit dem Sie viele verschiedene Rubine (nicht nur Matz) auf einem Computer installieren können , entweder lokal für den Benutzer oder global für alle Benutzer.

Ich weiß, dass Sie nach einem "Paket" gefragt haben, also funktioniert das vielleicht nicht für Sie. Aber ich dachte, es könnte helfen, wenn dies Ihre Entwicklungsmaschine ist.

Dies hat den Vorteil, dass Sie ein Gemset für 2.1.1 und andere für 2.0 oder 1.9.3 usw. installieren können. Sie können auch jruby, rubinius usw. testen, ohne Ihr System auf eines festlegen zu müssen.

Ich benutze es nicht für die Produktion, aber anscheinend ist es sowohl für diese als auch für die Entwicklung geeignet.

Hier ist der Schnellstart: https://rvm.io/rvm/install

Louis
quelle
1

Spät im Spiel, aber ich denke, dass diese Verwendung eine vielleicht umfassendere Lösung als update-alternativesdas Festcodieren von Symlinks darstellt. Sie wird hier ausführlich veröffentlicht, falls andere von der gleichen Frustration gebissen werden und eine native Lösung wünschen. Hiermit werden alle Binärdateien und Manpages verarbeitet, wobei die Verweise vorab entfernt werden, um Konflikte zu vermeiden.

Vorsichtsmaßnahmen:

  • Ich denke, dies muss erneut ausgeführt werden, wenn / wenn eine der Ruby-Versionen aktualisiert wird.
  • Ich bin kein Guru, update-alternativesdaher ist es möglich, dass dies übertrieben ist und / oder klug getan wird.

Skript (ich benannte 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
quelle
IIRC können Sie einfach ${RECMD}und ${CMD}ohne Anführungszeichen aufrufen , anstatt zu verwenden eval. Noch ein Hinweis: Ich leihe mir "klug" aus. :)
muru
Richtig ... es war ein beinahe hastiger Hack. Fest. Danke :-)
r2evans