¿Instalar ruby ​​2.0 sin el interruptor ruby?

23

La tarea de instalar ruby ​​2.0 en el último Ubuntu 14.04 me parece bastante frustrante. Soy consciente de que podría renunciar a los paquetes e instalarlos desde el origen, pero preferiría instalar un paquete, si eso es posible.

Encontré esta pregunta / respuesta sobre ruby ​​en 13.10, que se parecía a lo que quería.

¿Cómo instalar ruby?

Desafortunadamente, la estrategia no parece viable: el paquete ruby-switch se eliminó en 14.04.

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

La eliminación del paquete hace referencia a un error que, para mí, parece no tener ninguna relación.

Me desconcierta por qué instalar ruby2.0 usando apt-get instala ruby1.9 y lo convierte en el intérprete de ruby ​​predeterminado. Obtengo un binario ruby2.0, pero los scripts (que dependen de un intérprete 2.0 al ejecutar ruby) no lo captan. Además, cuando uso gem et. Alabama. instalar paquetes de ruby: estos parecen estar instalados para ruby1.9 en lugar de 2.0. Muy insatisfactorio

¿Alguien puede ofrecer una pista sobre la forma más sencilla de instalar ruby ​​2.0 como intérprete de ruby ​​estándar? ¿Cómo se espera que cambie de ruby ​​1.9 a 2.0 sin ruby-switch?

aSteve
fuente

Respuestas:

29

Para 14.04 encontré los siguientes PPA que vienen con Ruby 2.x

  • Agrega Ruby 2.1 a Ubuntu 14.04

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

También encontré en GoRails un conjunto de instrucciones para instalar Ruby en 14.04, pero supongo que debido a que son largos, querría un PPA en su lugar.

  • Agrega Ruby 1.9, 2.0 o 2.1 a Ubuntu 14.04

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

Después de agregar uno de ellos simplemente:

sudo apt-get update
sudo apt-get install ruby2.1 # In the case you want 2.1
Luis Alvarado
fuente
66
¿Es realmente necesario agregar un 'Archivo de paquete personal' para instalar Ruby 2.0 en Ubuntu 14.04, dado que hay un paquete para "Ruby2.0" disponible sin él?
aSteve
1
Pediste la forma más directa. Esto sería todo, al menos hasta que la versión oficial 2.x de Ruby aparezca en el Centro de software o hasta que la versión Ruby 2.0.x se actualice al número real que es y no como el error que recibió.
Luis Alvarado
Hmm ... ¿ ubuntuupdates.org/package/core/trusty/main/base/ruby2.0 sugiere que 2.0 ya está incluido en el repositorio "principal"?
aSteve
3
Sí, pero como mencionaste, no es la rama 2.x sino la 1.9. Entonces deberían arreglar eso.
Luis Alvarado
2
Parece que los intérpretes 2.0 y 1.9 están en el repositorio principal (con una dependencia extraña), pero el interruptor ruby ​​se ha eliminado por una razón espuria.
aSteve
8

La versión Debian de Ruby no admite varias instalaciones de ruby ​​en el mismo sistema. Debian obsoleto el paquete y Ubuntu simplemente lo eliminó de los repositorios. Debe usar rbenvpara cambiar entre diferentes versiones de ruby. Esta es la forma recomendada por la descripción del paquete ruby-switch y fue el método que se ha discutido en el error 737782 como preferido, ya que se dice que no debería haber más de una versión de ruby ​​en los repositorios.

Ruby 2.0 se instala de forma predeterminada al instalar el ruby2.0paquete y no se necesita ninguna otra acción. Si rubyse instaló el paquete, se recomienda eliminarlo. Debe tener el binario /usr/bin/ruby2.0disponible en su sistema.

Braiam
fuente
2
Hmmm ... Cuando instalé el paquete ruby2.0, obtuve un ejecutable ruby2.0 y un ejecutable ruby ​​1.9. Al interactuar con gem, ruby1.9 parecía asumirse como la versión ruby ​​del sistema. En una investigación más profunda, descubrí que los scripts (aunque afirman que necesitan ruby ​​2.0) en realidad funcionan bien con ruby ​​1.9, por lo que he abandonado el paquete ruby2.0. Solo quería una versión ruby, es decir, runy 2.0, pero los paquetes ubuntu 14.04 no parecían permitir eso.
aSteve
@aSteve en Debian No parece tener ese problema, a través de Ubuntu usa ese método. Si lo desea, intente crear un entorno virtual para ruby ​​2.0 con rbenv, solo para estar seguro.
Braiam
2
Definitivamente estoy viendo eso, y no tiene sentido. en apt-get install ruby2.0 Obtengo: Se instalarán los siguientes paquetes NUEVOS: libjs-jquery libruby1.9.1 libruby2.0 ruby ​​ruby1.9.1 ruby2.0 rubygems -integration
Josh Nankin
1
@jla no, en realidad, Debian elige no admitir varias versiones de Ruby , como puede ver en el registro de cambios . Debian dice que admitirá solo una versión y que las herramientas para cambiar las versiones están de alguna manera dañadas, esa es más o menos la situación en Debian. Ubuntu decidió no dar el salto a 2.0 en ese momento.
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
fuente
también puedes ln -fsforzar la actualización y evitar usar el siempre aterradorrm -rf
njzk2
5

Si desea cambiar entre rubíes, le recomiendo usar rvm ( https://rvm.io ). Es un administrador de paquetes y le permite instalar muchos rubíes diferentes (no solo los de Matz) en una máquina, ya sea local para el usuario o global para todos los usuarios.

Sé que pediste un "paquete", así que quizás esto no te funcione. Pero pensé que podría ayudar si esta es su máquina de desarrollo.

El beneficio de hacerlo de esta manera es que puede instalar un gemset para 2.1.1 y otros para 2.0 o 1.9.3, etc. También le permite probar jruby, rubinius, etc. sin comprometer su sistema a uno.

No lo estoy usando en producción, pero aparentemente es adecuado para eso y para el desarrollo.

Aquí está el inicio rápido: https://rvm.io/rvm/install

Louis
fuente
1

Al final del juego, pero creo que una solución quizás más completa que los enlaces simbólicos de codificación dura es este uso update-alternatives, publicado aquí de forma detallada en caso de que otros sean mordidos por la misma frustración y deseen una solución más nativa. Esto maneja todos los binarios y páginas de manual, eliminando preventivamente las referencias primero para evitar conflictos.

Advertencias:

  • Creo que esto tendrá que volver a ejecutarse si / cuando se actualiza una de las versiones de ruby.
  • No soy un gurú, por update-alternativeslo que es posible que esto sea excesivo y / o se haga a la ligera.

Guión (lo nombré 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
fuente
IIRC puede llamar ${RECMD}y ${CMD}sin comillas, en lugar de usar eval. En otra nota: voy a pedir prestado "a regañadientes". :)
muru
Es cierto ... fue un truco casi apresurado. Fijo. Gracias :-)
r2evans