Installer ruby ​​2.0 sans ruby-switch?

23

Je trouve la tâche d'installer ruby ​​2.0 sur le dernier Ubuntu 14.04 plutôt frustrante. Je suis conscient que je pourrais renoncer aux packages et installer à partir des sources - mais je préfère de loin installer un package - si cela est possible.

J'ai trouvé cette question / réponse sur ruby ​​le 13.10 - qui ressemblait à ce que je voulais.

Comment installer ruby?

Malheureusement, la stratégie ne semble pas viable - le package ruby-switch a été supprimé en 14.04.

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

La suppression du package fait référence à un bogue qui, pour moi, ne semble absolument pas lié.

Je suis perplexe sur la raison pour laquelle l'installation de ruby2.0 à l'aide d'apt-get installe ruby1.9 et en fait l'interpréteur ruby ​​par défaut. J'obtiens un binaire ruby2.0 - mais les scripts (qui dépendent d'un interprète 2.0 lors de l'exécution de ruby) ne le prennent pas. De plus, lorsque j'utilise gem et. Al. pour installer les packages ruby ​​- ceux-ci semblent être installés pour ruby1.9 plutôt que 2.0. Très insatisfaisant.

Quelqu'un peut-il donner un indice sur la façon la plus simple d'installer ruby ​​2.0 en tant qu'interpréteur ruby ​​standard? Comment dois-je passer de ruby ​​1.9 à 2.0 sans ruby-switch?

aSteve
la source

Réponses:

29

Pour la version 14.04, j'ai trouvé les PPA suivants fournis avec Ruby 2.x

  • Ajoute Ruby 2.1 à Ubuntu 14.04

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

J'ai également trouvé dans GoRails un ensemble d'instructions pour installer Ruby le 14.04 mais je suppose qu'étant donné qu'elles sont longues, vous voudriez un PPA à la place.

  • Ajoute Ruby 1.9, 2.0 ou 2.1 à Ubuntu 14.04

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

Après avoir ajouté l'un d'eux simplement:

sudo apt-get update
sudo apt-get install ruby2.1 # In the case you want 2.1
Luis Alvarado
la source
6
Est-il vraiment nécessaire d'ajouter une «archive de package personnelle» afin d'installer Ruby 2.0 dans Ubuntu 14.04 - étant donné qu'un package pour «Ruby2.0» est disponible sans?
aSteve
1
Vous avez demandé le moyen le plus simple. Ce serait le cas, au moins jusqu'à ce que la version officielle 2.x de Ruby apparaisse sur le Centre logiciel ou jusqu'à ce que la version Ruby 2.0.x mette à jour le nombre réel qu'elle est et pas comme le bogue que vous avez.
Luis Alvarado
Hmm ... ubuntuupdates.org/package/core/trusty/main/base/ruby2.0 ne suggère- t-il pas que 2.0 est déjà inclus dans le référentiel "principal"?
aSteve
3
Oui, mais comme vous l'avez mentionné, ce n'est pas la branche 2.x mais la 1.9. Ils devraient donc résoudre ce problème.
Luis Alvarado
2
Il semble que les interprètes 2.0 et 1.9 soient dans le référentiel principal (avec une dépendance étrange) - mais ruby-switch a été supprimé pour une raison fallacieuse.
aSteve
8

La version Debian de Ruby ne prend pas en charge plusieurs installations Ruby sur le même système. Debian a rendu le paquet obsolète et Ubuntu vient de le supprimer des référentiels. Vous devez utiliser rbenvpour basculer entre les différentes versions de rubis. C'est la méthode recommandée par la description du package ruby-switch et c'est la méthode qui a été discutée dans le bogue 737782 comme préférée, car il est dit qu'il ne devrait pas y avoir plus d'une seule version de ruby ​​dans les référentiels.

Ruby 2.0 est installé par défaut lors de l'installation du ruby2.0package et aucune autre action n'est nécessaire. Si le package a rubyété installé, il est recommandé de le supprimer. Vous devriez avoir le binaire /usr/bin/ruby2.0disponible sur votre système.

Braiam
la source
2
Hmmm ... Quand j'ai installé le paquet ruby2.0, j'ai eu un exécutable ruby2.0 et un exécutable ruby ​​1.9. Lors de l'interaction avec gem, ruby1.9 semblait être la version système ruby. Après une enquête plus approfondie, j'ai découvert que les scripts (tout en prétendant avoir besoin de ruby ​​2.0) fonctionnent réellement avec ruby ​​1.9 - j'ai donc abandonné le package ruby2.0. Je ne voulais qu'une seule version ruby ​​- c'est-à-dire runy 2.0 - mais les paquets ubuntu 14.04 ne semblaient pas le permettre.
aSteve
@aSteve dans Debian Je ne semble pas avoir ce problème, via Ubuntu utilise cette méthode. Si vous le souhaitez, essayez plutôt de créer un environnement virtuel pour ruby ​​2.0 avec rbenv, juste pour être sûr.
Braiam
2
je vois vraiment cela, et cela n'a aucun sens. sur apt-get install ruby2.0 J'obtiens: Les NOUVEAUX packages suivants seront installés: libjs-jquery libruby1.9.1 libruby2.0 ruby ​​ruby1.9.1 ruby2.0 rubygems-integration
Josh Nankin
1
@jla non, en fait, Debian choisit de ne pas prendre en charge plusieurs versions de Ruby , comme vous pouvez le voir dans le changelog . Debian dit qu'elle ne supportera qu'une seule version et les outils pour changer de version sont en quelque sorte cassés, c'est plus ou moins la situation dans Debian. Ubuntu a décidé de ne pas faire le saut pour 2.0 à ce moment-là.
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
la source
vous pouvez également ln -fsforcer la mise à jour et éviter d'utiliser le toujours effrayantrm -rf
njzk2
5

Si vous souhaitez basculer entre les rubis, je vous recommande d'utiliser rvm ( https://rvm.io ). C'est un gestionnaire de paquets et il vous permet d'installer de nombreux rubis différents (pas seulement Matz) sur une machine, soit local pour l'utilisateur ou globalement pour tous les utilisateurs.

Je sais que vous avez demandé un «package», alors peut-être que cela ne fonctionnera pas pour vous. Mais j'ai pensé que cela pourrait aider si c'est votre machine de développement.

L'avantage de le faire de cette façon est que vous pouvez installer un jeu de gemmes pour 2.1.1 et d'autres pour 2.0 ou 1.9.3, etc. Il vous permet également de tester jruby, rubinius, etc. sans engager votre système dans un seul.

Je ne l'utilise pas en production, mais apparemment, il convient à cela ainsi qu'au développement.

Voici le démarrage rapide: https://rvm.io/rvm/install

Louis
la source
1

Tard dans le jeu, mais je pense qu'une solution peut-être plus complète que les liens symboliques codés en dur est cette utilisation de update-alternatives codés en , publiée ici verbalement au cas où d'autres seraient mordus par la même frustration et souhaiteraient une solution plus native. Cela gère tous les binaires et les pages de manuel, supprimant d'abord les références de manière préventive pour éviter les conflits.

Mises en garde:

  • Je pense que cela devra être réexécuté si / quand l'une des versions ruby ​​est mise à jour.
  • Je ne suis pas un gourou avec update-alternativesdonc il est possible que ce soit exagéré et / ou fait de façon maladroite.

Script (j'ai nommé 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
la source
IIRC vous pouvez simplement appeler ${RECMD}et ${CMD}sans guillemets, au lieu d'utiliser eval. Sur une autre note: je vais emprunter "kludgingly". :)
muru
C'est vrai ... c'était un hack presque hâtif. Fixé. Merci :-)
r2evans