Cài đặt ruby ​​2.0 mà không có ruby-switch?


23

Tôi đang tìm kiếm nhiệm vụ cài đặt ruby ​​2.0 trên Ubuntu 14.04 mới nhất khá khó chịu. Tôi biết rằng tôi có thể từ bỏ các gói và cài đặt từ nguồn - nhưng tôi muốn cài đặt một gói hơn - nếu có thể.

Tôi tìm thấy câu hỏi / câu trả lời này về ruby ​​vào ngày 13.10 - trông giống như những gì tôi muốn.

Làm thế nào để cài đặt ruby?

Thật không may, chiến lược dường như không khả thi - gói ruby-switch đã bị xóa trong 14.04.

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

Việc xóa gói tham chiếu một lỗi mà theo tôi, trông hoàn toàn không liên quan.

Tôi băn khoăn về lý do cài đặt ruby2.0 bằng apt-get cài đặt ruby1.9 và biến nó thành trình thông dịch ruby ​​mặc định. Tôi nhận được một nhị phân ruby2.0 - nhưng các tập lệnh (phụ thuộc vào trình thông dịch 2.0 khi thực thi ruby) không chọn nó. Hơn nữa, khi tôi sử dụng gem et. al. để cài đặt các gói ruby ​​- những gói này dường như được cài đặt cho ruby1.9 thay vì 2.0. Rất không đạt yêu cầu.

Bất cứ ai cũng có thể đưa ra một gợi ý về cách đơn giản nhất để cài đặt ruby ​​2.0 làm trình thông dịch ruby ​​tiêu chuẩn? Làm thế nào tôi có thể chuyển từ ruby ​​1.9 sang 2.0 mà không có ruby-switch?

Câu trả lời:


29

Cho 14.04 tôi đã tìm thấy các PPA sau đi kèm với Ruby 2.x

  • Thêm Ruby 2.1 vào Ubuntu 14.04

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

Tôi cũng tìm thấy trong GoRails một bộ hướng dẫn để cài đặt Ruby vào ngày 14.04 nhưng tôi đoán vì chúng còn lâu bạn sẽ muốn có PPA.

  • Thêm Ruby 1.9, 2.0 hoặc 2.1 vào Ubuntu 14.04

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

Sau khi bạn thêm một trong số chúng một cách đơn giản:

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

6
Có thực sự cần thiết phải thêm 'Lưu trữ gói cá nhân' để cài đặt Ruby 2.0 trong Ubuntu 14.04 - với điều kiện là có gói "Ruby2.0" không có?
aSteve

1
Bạn yêu cầu cách đơn giản nhất. Đây sẽ là nó, ít nhất là cho đến khi phiên bản 2.x chính thức của Ruby xuất hiện trên Trung tâm phần mềm hoặc cho đến khi phiên bản Ruby 2.0.x cập nhật với số thực tế và không giống như lỗi bạn gặp phải.
Luis Alvarado

Hmm ... không ubfoxupdates.org/package/core/trusty/main/base/ruby2.0 đề xuất rằng 2.0 đã được bao gồm trong kho "chính"?
aSteve

3
Có nhưng như bạn đã đề cập, nó không phải là nhánh 2.x mà là 1.9. Vì vậy, họ nên khắc phục điều đó.
Luis Alvarado

2
Có vẻ như cả hai trình thông dịch 2.0 và 1.9 đều nằm trong kho lưu trữ chính (với sự phụ thuộc kỳ lạ) - nhưng ruby-switch đã bị xóa vì một lý do giả mạo.
aSteve

8

Phiên bản Debian của Ruby không hỗ trợ một số cài đặt ruby ​​trên cùng một hệ thống. Debian đã lỗi thời góiUbuntu chỉ gỡ nó khỏi kho. Bạn nên sử dụng rbenvđể chuyển đổi giữa các phiên bản ruby ​​khác nhau. Đây là cách được đề xuất theo mô tả gói ruby-switch và là phương pháp đã được thảo luận trong lỗi 737782 như được ưu tiên, thông qua nó nói rằng không nên có nhiều hơn một phiên bản ruby ​​trong kho.

Ruby 2.0 được cài đặt theo mặc định khi cài đặt ruby2.0gói và không cần thực hiện hành động nào khác. Nếu gói rubyđã được cài đặt được khuyến nghị để loại bỏ nó. Bạn nên có /usr/bin/ruby2.0sẵn nhị phân trên hệ thống của bạn.


2
Hmmm ... Khi tôi cài đặt gói ruby2.0, tôi đã có một tệp thực thi ruby2.0 và một tệp thực thi ruby ​​1.9. Khi tương tác với đá quý, ruby1.9 dường như được coi là phiên bản ruby ​​của hệ thống. Khi điều tra sâu hơn, tôi phát hiện ra rằng các tập lệnh (trong khi tuyên bố cần ruby ​​2.0) thực sự chạy tốt với ruby ​​1.9 - vì vậy tôi đã từ bỏ gói ruby2.0. Tôi chỉ muốn một phiên bản ruby ​​- tức là runy 2.0 - nhưng các gói Ubuntu 14.04 dường như không cho phép điều đó.
aSteve

@aSteve trong Debian Tôi dường như không gặp phải vấn đề đó, thông qua Ubuntu sử dụng phương pháp đó. Nếu bạn thích, hãy thử tạo một môi trường ảo cho ruby ​​2.0 bằng rbenv thay vào đó, chỉ để ở bên an toàn.
Braiam

2
Tôi chắc chắn thấy điều đó, và nó không có ý nghĩa. trên apt-get install ruby2.0 Tôi nhận được: Các gói MỚI sau đây sẽ được cài đặt: libjs-jquery libruby1.9.1 libruby2.0 ruby ​​ruby1.9.1 ruby2.0 tích hợp ruby2.0
Josh Nankin


1
@jla không, thực tế, Debian chọn không hỗ trợ một số phiên bản của Ruby , như bạn có thể thấy trong danh sách thay đổi . Debian nói rằng nó sẽ chỉ hỗ trợ một phiên bản và các công cụ để chuyển đổi phiên bản bị hỏng theo cách nào đó, đó là tình huống trong Debian ít nhiều. Ubuntu đã quyết định không thực hiện bước nhảy vọt cho 2.0 tại thời điểm đó.
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

bạn cũng có thể ln -fsbuộc cập nhật và tránh sử dụng luôn luôn đáng sợrm -rf
njzk2

5

Nếu bạn muốn chuyển đổi giữa các viên hồng ngọc, tôi khuyên bạn nên sử dụng rvm ( https://rvm.io ). Đây là trình quản lý gói và nó cho phép bạn cài đặt nhiều viên hồng ngọc khác nhau (không chỉ Matz) trên một máy, cho cả người dùng hoặc toàn cầu cho tất cả người dùng.

Tôi biết bạn đã yêu cầu một "gói", vì vậy có lẽ điều này sẽ không hiệu quả với bạn. Nhưng tôi đoán nó có thể giúp nếu đây là cỗ máy phát triển của bạn.

Lợi ích của việc thực hiện theo cách này là bạn có thể cài đặt một viên đá quý cho 2.1.1 và các loại khác cho 2.0 hoặc 1.9.3, v.v. Nó cũng cho phép bạn kiểm tra jruby, rubinius, v.v. mà không cần cam kết hệ thống của bạn với một.

Tôi không sử dụng nó trong sản xuất, nhưng rõ ràng nó phù hợp với điều đó cũng như sự phát triển.

Đây là phần khởi động nhanh: https://rvm.io/rvm/install


1

Cuối trò chơi nhưng tôi nghĩ một giải pháp có lẽ hoàn chỉnh hơn so với các liên kết mã hóa cứng là việc sử dụng này update-alternatives, được đăng ở đây một cách rõ ràng trong trường hợp những người khác bị cắn bởi cùng một sự thất vọng và muốn một giải pháp tự nhiên hơn. Điều này xử lý tất cả các tệp nhị phân và trang man, loại bỏ các tham chiếu trước để tránh xung đột.

Hãy cẩn thận:

  • Tôi nghĩ rằng điều này sẽ cần phải được chạy lại nếu / khi một trong những phiên bản ruby ​​được cập nhật.
  • Tôi không phải là một bậc thầy với update-alternativesvì vậy có thể điều này là quá mức cần thiết và / hoặc được thực hiện một cách đơn giản.

Kịch bản (tôi đặt tên 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

IIRC bạn chỉ có thể gọi ${RECMD}${CMD}không có dấu ngoặc kép, thay vì sử dụng eval. Một lưu ý khác: Tôi sẽ mượn "kydgingly". :)
muru

Đúng ... đó là một vụ hack gần như vội vàng. Đã sửa. Cảm ơn :-)
r2evans
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.