ติดตั้ง ruby ​​2.0 แบบไม่มี ruby-switch หรือไม่?


23

ฉันกำลังค้นหางานของการติดตั้ง ruby ​​2.0 บน Ubuntu 14.04 ล่าสุดค่อนข้างน่าผิดหวัง ฉันรู้ว่าฉันสามารถละแพคเกจและติดตั้งจากแหล่งที่มา - แต่ฉันค่อนข้างจะติดตั้งแพคเกจ - ถ้าเป็นไปได้

ฉันพบคำถาม / คำตอบเกี่ยวกับทับทิมที่ 13.10 - ซึ่งดูเหมือนว่าฉันต้องการ

วิธีการติดตั้งทับทิม

น่าเสียดายที่กลยุทธ์ดูเหมือนจะไม่สามารถใช้งานได้แพ็คเกจแพ็คเกจ ruby-switch ถูกลบไปแล้วใน 14.04

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

การลบแพ็กเกจอ้างอิงข้อผิดพลาดซึ่งสำหรับฉันแล้วดูไม่เกี่ยวข้องเลย

ฉันสงสัยว่าทำไมการติดตั้ง ruby2.0 โดยใช้ apt-get installs ruby1.9 และทำให้มันเป็นล่ามทับทิมเริ่มต้น ฉันจะได้รับ ruby2.0 ไบนารี - แต่สคริปต์ (ซึ่งขึ้นอยู่กับล่าม 2.0 เมื่อดำเนินการ ruby) อย่าหยิบมันขึ้นมา นอกจากนี้เมื่อฉันใช้อัญมณีและ อัล เพื่อติดตั้งแพ็คเกจ ruby ​​- ดูเหมือนว่าจะติดตั้งสำหรับ ruby1.9 มากกว่า 2.0 ไม่น่าพอใจมาก

ทุกคนสามารถให้คำแนะนำเกี่ยวกับวิธีที่ง่ายที่สุดในการติดตั้ง ruby ​​2.0 เป็นล่ามทับทิมมาตรฐานหรือไม่? ฉันจะเปลี่ยนจาก ruby ​​1.9 เป็น 2.0 เป็น ruby-switch ได้อย่างไร?

คำตอบ:


29

สำหรับ 14.04 ฉันพบ PPAs ต่อไปนี้ที่มาพร้อมกับ Ruby 2.x

  • เพิ่ม Ruby 2.1 ไปยัง Ubuntu 14.04

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

ฉันยังพบใน GoRails ชุดคำแนะนำในการติดตั้ง Ruby ใน 14.04 แต่ฉันเดาเพราะพวกเขามีความยาวที่คุณต้องการ PPA แทน

  • เพิ่ม Ruby 1.9, 2.0 หรือ 2.1 ไปยัง Ubuntu 14.04

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

หลังจากที่คุณเพิ่มหนึ่งในนั้น:

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

6
จำเป็นหรือไม่ที่จะต้องเพิ่ม 'Personal Package Archive' เพื่อติดตั้ง Ruby 2.0 ใน Ubuntu 14.04 - ระบุว่ามีแพ็คเกจสำหรับ "Ruby2.0" หรือไม่?
aSteve

1
คุณขอวิธีที่ตรงไปตรงมาที่สุด อย่างน้อยก็จนกว่า Ruby เวอร์ชัน 2.x อย่างเป็นทางการจะปรากฏบน Software Center หรือจนกว่าเวอร์ชัน Ruby 2.0.x จะอัปเดตเป็นหมายเลขจริงว่าเป็นและไม่เหมือนกับข้อบกพร่องที่คุณได้รับ
Luis Alvarado

อืม ... ไม่ubuntuupdates.org/package/core/trusty/main/base/ruby2.0ขอแนะนำว่า 2.0 รวมอยู่ในที่เก็บ "หลัก" แล้วหรือยัง?
aSteve

3
ใช่ แต่อย่างที่คุณพูดถึงมันไม่ใช่สาขา 2.x แต่เป็น 1.9 ดังนั้นพวกเขาควรแก้ไข
Luis Alvarado

2
ดูเหมือนว่าทั้งสอง 2.0 และ 1.9 ล่ามอยู่ในพื้นที่เก็บข้อมูลหลัก (ด้วยการพึ่งพาที่แปลก) - แต่ ruby-switch ถูกลบไปด้วยเหตุผลปลอม
aSteve

8

รุ่น Debian ของ Ruby ไม่รองรับการติดตั้ง ruby ​​หลายตัวในระบบเดียวกัน Debian ล้าสมัยแพ็คเกจและUbuntu เพิ่งลบมันออกจากที่เก็บ คุณควรใช้rbenvเพื่อสลับระหว่างทับทิมแต่ละรุ่น นี่เป็นวิธีที่แนะนำโดยคำอธิบายแพ็คเกจทับทิมและเป็นวิธีที่ได้รับการกล่าวถึงในข้อผิดพลาด 737782ตามที่ต้องการเพราะมันบอกว่าไม่ควรมีทับทิมมากกว่าหนึ่งรุ่นในที่เก็บ

Ruby 2.0 จะถูกติดตั้งตามค่าเริ่มต้นเมื่อทำการติดตั้งruby2.0แพ็คเกจและไม่จำเป็นต้องดำเนินการใด ๆ หากแพ็คเกจที่rubyติดตั้งถูกแนะนำให้ลบออก คุณควรมีไบนารี่ที่/usr/bin/ruby2.0มีอยู่ในระบบของคุณ


2
อืม ... เมื่อฉันติดตั้งแพ็คเกจ ruby2.0 ฉันได้รับ ruby2.0 และ executable 1.9 ruby เมื่อทำการโต้ตอบกับอัญมณี ruby1.9 จะถือว่าเป็นรุ่น ruby ​​ของระบบ ในการตรวจสอบเพิ่มเติมฉันค้นพบว่าสคริปต์ (ในขณะที่อ้างว่าจำเป็นต้องใช้ทับทิม 2.0) ทำงานได้จริงด้วยทับทิม 1.9 - ดังนั้นฉันจึงละทิ้งแพ็คเกจ ruby2.0 ฉันต้องการรุ่นทับทิมหนึ่งอัน - เช่น runy 2.0 - แต่แพคเกจ Ubuntu 14.04 ดูเหมือนจะไม่อนุญาต
aSteve

@aSteve ใน Debian ฉันดูเหมือนจะไม่มีปัญหานั้นผ่าน Ubuntu ใช้วิธีการนั้น หากคุณต้องการลองสร้างสภาพแวดล้อมเสมือนจริงสำหรับ ruby ​​2.0 ด้วย rbenv แทนเพื่ออยู่ในด้านที่ปลอดภัย
Braiam

2
ฉันเห็นอย่างแน่นอนและมันก็ไม่มีเหตุผล ใน apt-get install ruby2.0 ที่ฉันได้รับ: แพ็คเกจใหม่ต่อไปนี้จะได้รับการติดตั้ง: libjs-jquery libruby1.9.1 libruby2.0 ruby ​​ruby1.9.1 ruby2.0 rubygems- การรวมเข้าด้วยกัน
Josh Nankin


1
@jla ไม่มีจริง Debian เลือกที่จะไม่ให้การสนับสนุนหลายรุ่นของทับทิมเป็นคุณสามารถเห็นในการเปลี่ยนแปลง Debian กล่าวว่ามันจะรองรับเพียงเวอร์ชันเดียวและเครื่องมือในการสลับรุ่นจะใช้งานไม่ได้นั่นคือสถานการณ์ใน Debian ไม่มากก็น้อย อูบุนตูตัดสินใจที่จะไม่กระโดดในเวลานั้นในขณะนั้น
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

คุณสามารถln -fsบังคับการอัปเดตและหลีกเลี่ยงการใช้งานที่น่ากลัวอยู่เสมอrm -rf
njzk2

5

หากคุณต้องการสลับระหว่างทับทิมฉันแนะนำให้ใช้ rvm ( https://rvm.io ) เป็นผู้จัดการแพ็คเกจและช่วยให้คุณติดตั้งทับทิมที่แตกต่างกันมากมาย (ไม่ใช่แค่ Matz's) ในเครื่องเดียวไม่ว่าจะเป็นผู้ใช้ในพื้นที่หรือทั่วโลกสำหรับผู้ใช้ทั้งหมด

ฉันรู้ว่าคุณขอ "แพ็คเกจ" ดังนั้นอาจจะไม่เหมาะกับคุณ แต่ฉันคิดว่ามันอาจช่วยได้หากนี่เป็นเครื่องพัฒนาของคุณ

ประโยชน์ของการทำเช่นนี้คือคุณสามารถติดตั้งหนึ่ง gemset สำหรับ 2.1.1 และอื่น ๆ สำหรับ 2.0 หรือ 1.9.3 เป็นต้นนอกจากนี้ยังช่วยให้คุณทดสอบ jruby, rubinius และอื่น ๆ โดยไม่ต้องใช้ระบบของคุณ

ฉันไม่ได้ใช้มันในการผลิต แต่เห็นได้ชัดว่ามันเหมาะสำหรับสิ่งนั้นและการพัฒนา

นี่คือความรวดเร็ว: https://rvm.io/rvm/install


1

ในช่วงท้ายเกม แต่ฉันคิดว่าวิธีแก้ปัญหาที่สมบูรณ์กว่าการใช้ symlink แบบเข้ารหัสนั้นเป็นการupdate-alternativesโพสต์ที่นี่ในกรณีที่ผู้อื่นถูกกัดด้วยความหงุดหงิดเดียวกันและต้องการวิธีแก้ปัญหาแบบดั้งเดิมมากกว่า วิธีนี้จะจัดการไบนารีและหน้าคนทั้งหมดโดยการลบการอ้างอิงก่อนเพื่อป้องกันความขัดแย้ง

คำเตือน:

  • ฉันคิดว่านี่จะต้องมีการรันใหม่หาก / เมื่อหนึ่งในทับทิมรุ่นปรับปรุง
  • ฉันไม่ได้เป็นกูรูด้วยupdate-alternativesดังนั้นจึงเป็นไปได้ว่านี่เป็น overkill และ / หรือทำอย่างซุบซิบ

สคริปต์ (ฉันชื่อ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 คุณก็สามารถโทร${RECMD}และไม่มีเครื่องหมายคำพูดแทนการใช้${CMD} evalในหมายเหตุอื่น: ฉันจะยืม "kludgingly" :)
muru

จริง ... มันเป็นแฮ็คที่ใกล้เร็ว คงที่ ขอบคุณ :-)
r2evans
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.