Instal ruby ​​2.0 tanpa ruby-switch?

23

Saya menemukan tugas menginstal ruby ​​2.0 pada Ubuntu 14.04 terbaru agak frustasi. Saya sadar bahwa saya bisa melupakan paket dan menginstal dari sumber - tapi saya lebih suka menginstal paket - jika itu mungkin.

Saya menemukan pertanyaan / jawaban ini tentang ruby ​​pada 13.10 - yang tampak seperti apa yang saya inginkan.

Bagaimana cara menginstal ruby?

Sayangnya, strategi tersebut tampaknya tidak dapat dijalankan - paket ruby-switch telah dihapus pada 14.04.

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

Penghapusan paket referensi bug yang, bagi saya, terlihat sama sekali tidak terkait.

Saya bingung mengapa menginstal ruby2.0 menggunakan apt-get install ruby1.9 dan menjadikannya default interpreter ruby. Saya memang mendapatkan biner ruby2.0 - tetapi skrip (yang bergantung pada penerjemah 2.0 saat menjalankan ruby) tidak mengambilnya. Selanjutnya, saat saya menggunakan gem et. Al. untuk menginstal paket ruby ​​- ini tampaknya diinstal untuk ruby1.9 daripada 2.0. Sangat tidak memuaskan.

Adakah yang bisa memberikan petunjuk tentang cara paling mudah untuk menginstal ruby ​​2.0 sebagai interpreter ruby ​​standar? Bagaimana saya bisa beralih dari ruby ​​1.9 ke 2.0 tanpa ruby-switch?

aSteve
sumber

Jawaban:

29

Untuk 14,04 saya menemukan PPA berikut yang datang dengan Ruby 2.x

  • Menambahkan Ruby 2.1 ke Ubuntu 14.04

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

Saya juga menemukan di GoRails seperangkat instruksi untuk menginstal Ruby pada 14,04 tetapi saya menduga karena mereka lama Anda ingin PPA sebagai gantinya.

  • Menambahkan Ruby 1.9, 2.0 atau 2.1 ke Ubuntu 14.04

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

Setelah Anda menambahkan salah satunya:

sudo apt-get update
sudo apt-get install ruby2.1 # In the case you want 2.1
Luis Alvarado
sumber
6
Apakah benar-benar perlu untuk menambahkan 'Arsip Paket Pribadi' untuk menginstal Ruby 2.0 di Ubuntu 14.04 - mengingat bahwa ada paket untuk "Ruby2.0" yang tersedia tanpa?
aSteve
1
Anda meminta cara yang paling mudah. Ini akan menjadi itu, setidaknya sampai versi 2.x resmi Ruby muncul di Pusat Perangkat Lunak atau sampai versi Ruby 2.0.x memperbarui ke nomor aktualnya dan tidak seperti bug yang Anda dapatkan.
Luis Alvarado
Hmm ... bukankah ubuntuupdates.org/package/core/trusty/main/base/ruby2.0 menyarankan bahwa 2.0 sudah termasuk dalam repositori "utama"?
aSteve
3
Ya tapi seperti yang Anda sebutkan itu bukan cabang 2.x tetapi 1.9. Jadi mereka harus memperbaikinya.
Luis Alvarado
2
Sepertinya kedua penafsir 2.0 dan 1.9 berada di repositori utama (dengan ketergantungan yang aneh) - tetapi ruby-switch telah dihapus karena alasan palsu.
aSteve
8

Ruby versi Debian tidak mendukung beberapa instalasi ruby ​​pada sistem yang sama. Debian menghapus paket dan Ubuntu baru saja menghapusnya dari repositori. Anda harus menggunakan rbenvuntuk beralih di antara versi ruby ​​yang berbeda. Ini adalah cara yang disarankan oleh deskripsi paket ruby-switch dan metode yang telah dibahas dalam bug 737782 lebih disukai, melalui dikatakan bahwa tidak boleh ada lebih dari satu versi ruby ​​di repositori.

Ruby 2.0 diinstal secara default saat menginstal ruby2.0paket dan tidak ada tindakan lain yang diperlukan. Jika paket rubyitu diinstal disarankan untuk menghapusnya. Anda harus memiliki biner yang /usr/bin/ruby2.0tersedia di sistem Anda.

Braiam
sumber
2
Hmmm ... Ketika saya menginstal paket ruby2.0, saya mendapatkan executable ruby2.0 dan 1.9 executable ruby. Saat berinteraksi dengan gem, ruby1.9 tampaknya dianggap sebagai versi sistem ruby. Pada penyelidikan lebih lanjut, saya menemukan bahwa skrip (walaupun mengaku membutuhkan ruby ​​2.0) sebenarnya berjalan dengan baik dengan ruby ​​1.9 - jadi saya telah meninggalkan paket ruby2.0. Saya hanya ingin satu versi ruby ​​- yaitu runy 2.0 - tetapi paket-paket ubuntu 14.04 sepertinya tidak mengizinkan itu.
aSteve
@ aSteve di Debian Saya sepertinya tidak memiliki masalah itu, melalui Ubuntu menggunakan metode itu. Jika Anda suka, coba buat lingkungan virtual untuk ruby ​​2.0 dengan rbenv sebagai gantinya, hanya untuk berada di sisi yang aman.
Braiam
2
Saya pasti melihat itu, dan itu tidak masuk akal. di apt-get install ruby2.0 Saya mendapatkan: Paket BARU berikut ini akan diinstal: libjs-jquery libruby1.9.1 libruby2.0 ruby ​​ruby1.9.1 ruby2.0 rubygems-integrasi
Josh Nankin
1
@ jla tidak, sebenarnya, Debian memilih untuk tidak mendukung beberapa versi Ruby , seperti yang Anda lihat di changelog . Debian mengatakan itu akan mendukung hanya satu versi dan alat untuk beralih versi entah bagaimana rusak, itu kurang lebih situasi di Debian. Ubuntu memutuskan untuk tidak membuat lompatan untuk 2.0 pada saat itu.
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
sumber
Anda juga ln -fsdapat memaksa pembaruan dan menghindari penggunaan yang selalu menakutkanrm -rf
njzk2
5

Jika Anda ingin beralih di antara rubi, saya sarankan menggunakan rvm ( https://rvm.io ). Ini adalah manajer paket dan memungkinkan Anda untuk menginstal banyak rubi yang berbeda (bukan hanya Matz) pada satu mesin, baik lokal untuk pengguna atau global untuk semua pengguna.

Saya tahu Anda meminta "paket," jadi mungkin ini tidak akan berhasil untuk Anda. Tapi saya pikir mungkin membantu jika ini adalah mesin pengembangan Anda.

Manfaat melakukannya dengan cara ini adalah Anda dapat menginstal satu permata untuk 2.1.1 dan lainnya untuk 2.0 atau 1.9.3, dll. Ini juga memungkinkan Anda untuk menguji jruby, rubinius, dll. Tanpa melakukan sistem Anda ke satu.

Saya tidak menggunakannya untuk produksi, tetapi tampaknya ini cocok untuk itu juga untuk pengembangan.

Inilah quickstart: https://rvm.io/rvm/install

Louis
sumber
1

Terlambat dalam permainan tapi saya pikir solusi yang mungkin lebih lengkap daripada symlink hard-coding adalah penggunaan ini update-alternatives , diposting di sini secara lisan kalau-kalau orang lain digigit oleh frustrasi yang sama dan ingin solusi yang lebih asli. Ini menangani semua biner dan halaman manual, terlebih dahulu menghapus referensi terlebih dahulu untuk menghindari konflik.

Peringatan:

  • Saya pikir ini perlu dijalankan kembali jika / ketika salah satu versi ruby ​​diperbarui.
  • Saya bukan seorang guru dengan update-alternativesjadi mungkin ini berlebihan dan / atau dilakukan dengan hati-hati.

Script (saya beri nama 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
sumber
IIRC Anda bisa langsung menelepon ${RECMD}dan ${CMD}tanpa tanda kutip, alih-alih menggunakan eval. Pada catatan lain: Saya akan meminjam "dengan senang hati". :)
muru
Benar ... itu adalah retas yang hampir tergesa-gesa. Tetap. Terima kasih :-)
r2evans