Frage Installieren Sie Ruby 2.0 ohne Ruby-Schalter?


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

Ich habe diese Frage / Antwort zu Ruby am 13.10 gefunden - was aussah wie ich es wollte.

Wie installiere ich Ruby?

Leider scheint die Strategie nicht durchführbar - das Ruby-Switch-Paket wurde in 14.04 gelöscht.

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

Das Löschen der Paketverweise ein Käfer was für mich völlig unzusammenhängend aussieht.

Ich bin verwirrt darüber, warum ruby2.0 mit apt-get installs ruby1.9 installiert wird und es der Standard-Ruby-Interpreter wird. Ich bekomme eine Ruby2.0-Binärdatei - aber Skripte (die bei der Ausführung von Ruby von einem 2.0-Interpreter abhängen) nehmen es nicht auf. Außerdem, wenn ich gem et. al. Ruby-Pakete installieren - diese scheinen für Ruby1.9 statt 2.0 installiert zu sein. Sehr unbefriedigend.

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


23
2018-04-21 16:39


Ursprung




Antworten:


Für 14.04 habe ich folgende PPAs gefunden, die mit Ruby 2.x kommen

  • Fügt Ruby 2.1 zu Ubuntu 14.04 hinzu

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

Ich habe auch in GoRails eine gefunden Anleitungsset Ruby am 14.04 zu installieren, aber ich vermute, da sie lang sind, würden Sie stattdessen ein PPA wollen.

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

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

Nachdem du eines von ihnen einfach hinzugefügt hast:

sudo apt-get update
sudo apt-get install ruby2.1 # In the case you want 2.1

29
2018-04-21 17:28



Ist es wirklich notwendig, ein "Personal Package Archive" hinzuzufügen, um Ruby 2.0 in Ubuntu 14.04 zu installieren - vorausgesetzt, es gibt ein Paket für "Ruby2.0" ohne? - aSteve
Du hast nach dem einfachsten Weg gefragt. Das wäre es, zumindest bis die offizielle Version 2.x von Ruby auf dem Software Center erscheint oder bis die Version 2.0.x von Ruby auf die tatsächliche Nummer aktualisiert wird und nicht wie der Fehler, den Sie bekommen haben. - Luis Alvarado♦
Hmm ... nicht ubuntuupdates.org/package/core/trusty/main/base/ruby2.0 schlagen vor, dass 2.0 bereits im "Haupt" -Repository enthalten ist? - aSteve
Ja, aber wie du schon erwähnt hast, ist es nicht der 2.x-Zweig, sondern der 1.9. Also sollten sie das beheben. - Luis Alvarado♦
Es sieht so aus, als wären die Interpreter 2.0 und 1.9 im Haupt-Repository (mit einer seltsamen Abhängigkeit) - aber Ruby-Switch wurde aus einem falschen Grund gelöscht. - aSteve


Die Debian-Version von Ruby unterstützt nicht mehrere Ruby-Installationen auf demselben System. Debian hat das Paket veraltet und Ubuntu hat es einfach entfernt aus den Repositories. Du solltest benutzen rbenv zwischen verschiedenen Ruby-Versionen wechseln. Dies ist der empfohlene Weg durch Ruby-Switch-Paketbeschreibung und war die Methode, die in diskutiert wurde Fehler 737782 wie es bevorzugt wird, wird gesagt, dass es nicht mehr als nur eine Version von Ruby in den Repositories geben sollte.

Ruby 2.0 wird standardmäßig bei der Installation von installiert ruby2.0 Paket und keine andere Aktion ist erforderlich. Wenn das Paket ruby Wurde installiert, wird empfohlen, es zu entfernen. Sie sollten die Binärdatei haben /usr/bin/ruby2.0 verfügbar auf Ihrem System.


8
2018-04-29 13:56



Hmmm ... Als ich das ruby2.0-Paket installiert habe, habe ich eine ruby2.0-Programmdatei und eine ruby ​​1.9-Programmdatei bekommen. Bei der Interaktion mit Gem schien Ruby1.9 als System-Ruby-Version zu gelten. Bei weiteren Ermittlungen stellte ich fest, dass die Skripte (obwohl sie behaupten, dass sie Ruby 2.0 benötigen) mit Ruby 1.9 eigentlich gut laufen - ich habe das Ruby2.0-Paket also aufgegeben. Ich wollte nur eine Ruby-Version - d. H. Runy 2.0 - aber die Ubuntu 14.04-Pakete schienen das nicht zu erlauben. - aSteve
@aSteve in Debian Ich habe dieses Problem anscheinend nicht, da Ubuntu diese Methode verwendet. Wenn Sie möchten, versuchen Sie stattdessen eine virtuelle Umgebung für ruby ​​2.0 mit rbenv zu erstellen, nur um auf der sicheren Seite zu sein. - Braiam
Ich sehe das definitiv und es ergibt keinen Sinn. Auf 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
eben gesehen blog.costan.us/2014/04/restoring-ruby-20-on-ubuntu-1404.html - Josh Nankin
@jla nein, eigentlich, Debian wählt aus, dass mehrere Versionen von Ruby nicht unterstützt werden, wie Sie in der sehen können Änderungsprotokoll. Debian sagt, es werde nur eine Version unterstützen und die Tools zum Wechseln der Versionen sind irgendwie kaputt, das ist mehr oder weniger die Situation in Debian. Ubuntu hat sich entschieden, zu diesem Zeitpunkt den Sprung für 2.0 nicht zu machen. - Braiam


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

7
2017-11-20 23:22



du kannst auch ln -fs um das Update zu erzwingen und das immer beängstigende zu vermeiden rm -rf - njzk2


Wenn du zwischen Rubinen wechseln willst, empfehle ich rvm (https://rvm.io). Es ist ein Paket-Manager, und Sie können es installieren viele verschiedene Rubine (nicht nur von Matz) auf einer Maschine, entweder lokal für den Benutzer oder global für alle Benutzer.

Ich weiß, dass du nach einem "Paket" gefragt hast, also wird das vielleicht nicht für dich funktionieren. Aber ich dachte, es könnte helfen, wenn das deine Entwicklungsmaschine ist.

Der Vorteil dieser Vorgehensweise besteht darin, dass Sie ein Modulset für 2.1.1 und andere für 2.0 oder 1.9.3 usw. installieren können. Es ermöglicht Ihnen auch, jruby, rubinius usw. zu testen, ohne Ihr System an eines zu binden.

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

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


5
2018-04-29 00:33





Spät im Spiel, aber ich denke, eine vielleicht vollständigere Lösung als hard-coding Symlinks ist diese Verwendung von update-alternatives, hier ausführlich gepostet, falls andere von derselben Frustration gebissen werden und eine nativere Lösung wünschen. Dies behandelt alle Binärdateien und Manpages und entfernt zuerst die Referenzen, um Konflikte zu vermeiden.

Vorbehalte:

  • Ich denke, das muss erneut ausgeführt werden, wenn / wenn eine der Ruby-Versionen aktualisiert wird.
  • Ich bin kein Guru mit update-alternatives Es ist also möglich, dass dies übertrieben und / oder klobig durchgeführt wird.

Skript (ich nannte 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

1
2018-04-19 23:17



IIRC können Sie einfach anrufen ${RECMD} und ${CMD} ohne Anführungszeichen, anstatt zu verwenden eval. Auf eine andere Anmerkung: Ich werde "kludgingly" leihen. :) - muru
Stimmt ... Es war ein fast hastiger Hack. Fest. Vielen Dank :-) - r2evans