Instalar o ruby ​​2.0 sem o ruby-switch?

23

Estou achando a tarefa de instalar o ruby ​​2.0 no último Ubuntu 14.04 bastante frustrante. Estou ciente de que poderia renunciar aos pacotes e instalar a partir do código-fonte - mas prefiro instalar um pacote - se isso for possível.

Encontrei esta pergunta / resposta sobre ruby ​​em 13.10 - que parecia o que eu queria.

Como instalar o ruby?

Infelizmente, a estratégia não parece viável - o pacote ruby-switch foi excluído na 14.04.

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

A exclusão do pacote faz referência a um bug que, para mim, parece totalmente não relacionado.

Estou confuso sobre por que instalar o ruby2.0 usando o apt-get instala o ruby1.9 e o torna o interpretador padrão de ruby. Eu recebo um binário ruby2.0 - mas os scripts (que dependem de um interpretador 2.0 ao executar o ruby) não o captam. Além disso, quando eu uso gem et. al. instalar pacotes ruby ​​- estes parecem ter sido instalados no ruby1.9 em vez do 2.0. Muito insatisfatório.

Alguém pode oferecer uma dica sobre a maneira mais direta de instalar o ruby ​​2.0 como intérprete padrão do ruby? Como devo mudar do ruby ​​1.9 para o 2.0 sem o ruby-switch?

aSteve
fonte

Respostas:

29

Para 14.04, encontrei os seguintes PPAs que acompanham o Ruby 2.x

  • Adiciona Ruby 2.1 ao Ubuntu 14.04

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

Também encontrei no GoRails um conjunto de instruções para instalar o Ruby na 14.04, mas acho que, como são longas, você deseja um PPA.

  • Adiciona Ruby 1.9, 2.0 ou 2.1 ao Ubuntu 14.04

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

Depois de adicionar um deles simplesmente:

sudo apt-get update
sudo apt-get install ruby2.1 # In the case you want 2.1
Luis Alvarado
fonte
6
É realmente necessário adicionar um 'Personal Package Archive' para instalar o Ruby 2.0 no Ubuntu 14.04 - já que existe um pacote para o "Ruby2.0" disponível sem?
aSteve
1
Você pediu o caminho mais direto. É assim, pelo menos até que a versão 2.x oficial do Ruby apareça no Software Center ou até que a versão Ruby 2.0.x seja atualizada para o número real e não o bug que você recebeu.
Luis Alvarado
Hmm ... ubuntuupdates.org/package/core/trusty/main/base/ruby2.0 sugere que o 2.0 já esteja incluído no repositório "principal"?
aSteve
3
Sim, mas como você mencionou, não é o ramo 2.x, mas o 1.9. Então eles deveriam consertar isso.
Luis Alvarado
2
Parece que os intérpretes 2.0 e 1.9 estão no repositório principal (com uma dependência estranha) - mas o switch ruby ​​foi excluído por um motivo falso.
precisa saber é
8

A versão Debian do Ruby não suporta várias instalações de ruby ​​no mesmo sistema. O Debian obsoleta o pacote e o Ubuntu apenas o removeu dos repositórios. Você deve usar rbenvpara alternar entre diferentes versões do ruby. Essa é a maneira recomendada pela descrição do pacote ruby-switch e foi o método que foi discutido no bug 737782 como preferencial, já que foi dito que não deveria haver mais do que apenas uma versão do ruby ​​nos repositórios.

O Ruby 2.0 é instalado por padrão ao instalar o ruby2.0pacote e nenhuma outra ação é necessária. Se o pacote rubyfoi instalado, é recomendável removê-lo. Você deve ter o binário /usr/bin/ruby2.0disponível no seu sistema.

Braiam
fonte
2
Hmmm ... Quando instalei o pacote ruby2.0, obtive um executável ruby2.0 e um executável ruby ​​1.9. Ao interagir com o gem, o ruby1.9 parecia ser assumido como a versão do ruby ​​do sistema. Em uma investigação mais aprofundada, descobri que os scripts (embora afirmando precisar do ruby ​​2.0) realmente funcionam bem com o ruby ​​1.9 - então eu abandonei o pacote ruby2.0. Eu só queria uma versão ruby ​​- ie runy 2.0 - mas os pacotes do ubuntu 14.04 não pareciam permitir isso.
precisa saber é
@aSteve no Debian Parece que não tenho esse problema, pois o Ubuntu usa esse método. Se quiser, tente criar um ambiente virtual para ruby ​​2.0 com rbenv, apenas para estar do lado seguro.
Braiam 30/04
2
Definitivamente, estou vendo isso, e não faz sentido. do apt-get install ruby2.0 I get: Os seguintes NOVOS pacotes serão instalados: libjs-jquery libruby1.9.1 libruby2.0 rubi ruby1.9.1 ruby2.0 rubygems-integração
Josh Nankin
1
@jla não, na verdade, o Debian escolhe não suportar várias versões do Ruby , como você pode ver no log de alterações . O Debian diz que suportará apenas uma versão e as ferramentas para trocar de versão estão de alguma forma quebradas, que é mais ou menos a situação no Debian. O Ubuntu decidiu não dar o salto para a versão 2.0 naquele 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
fonte
você também pode ln -fsforçar a atualização e evitar o uso do sempre assustadorrm -rf
njzk2
5

Se você deseja alternar entre rubis, recomendo usar o rvm ( https://rvm.io ). É um gerenciador de pacotes e permite instalar muitos rubis diferentes (não apenas os Matz) em uma máquina, local para o usuário ou globalmente para todos os usuários.

Sei que você pediu um "pacote", então talvez isso não funcione para você. Mas achei que poderia ajudar se esta for sua máquina de desenvolvimento.

A vantagem de fazer desta maneira é que você pode instalar um gemset para 2.1.1 e outros para 2.0 ou 1.9.3, etc. Também permite testar jruby, rubinius, etc., sem comprometer seu sistema.

Não estou usando na produção, mas aparentemente é adequado tanto para isso quanto para o desenvolvimento.

Aqui está o início rápido: https://rvm.io/rvm/install

Louis
fonte
1

No final do jogo, mas acho que talvez seja uma solução mais completa do que os links simbólicos codificados update-alternatives, postados aqui aqui, caso outros sejam mordidos pela mesma frustração e desejem uma solução mais nativa. Isso lida com todos os binários e páginas de manual, removendo preventivamente as referências primeiro para evitar conflitos.

Ressalvas:

  • Eu acho que isso precisará ser executado novamente se / quando uma das versões do ruby ​​for atualizada.
  • Eu não sou um guru, update-alternativespor isso é possível que isso seja um exagero e / ou seja feito com desdém.

Script (eu nomeei 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
fonte
IIRC, você pode simplesmente ligar ${RECMD}e ${CMD}sem aspas, em vez de usar eval. Em outra nota: eu vou pedir emprestado "kludgingly". :)
muru
É verdade ... foi um truque quase apressado. Fixo. Obrigado :-)
r2evans