是否安装没有ruby-switch的ruby 2.0?


23

我发现在最新的Ubuntu 14.04上安装ruby 2.0的任务相当令人沮丧。我知道我可以放弃这些软件包并从源代码安装-但如果可能的话,我宁愿安装一个软件包。

我在13.10上找到了有关红宝石的问题/答案-看起来像我想要的。

如何安装ruby?

不幸的是,该策略似乎不可行-ruby-switch软件包已在14.04中删除。

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

对我来说,删除软件包引用了一个与我完全无关的错误。

我很困惑为什么使用apt-get安装ruby2.0会安装ruby1.9并使其成为默认的ruby解释器。我确实得到了ruby2.0二进制文件-但是脚本(执行ruby时依赖于2.0解释器)不会将其提取。此外,当我使用gem et。等 安装ruby软件包-这些似乎是为ruby1.9而不是2.0安装的。非常不满意。

任何人都可以提供有关将ruby 2.0安装为标准ruby解释器的最直接方法的提示吗?我应该如何在不使用ruby-switch的情况下从ruby 1.9切换到2.0?

Answers:


29

对于14.04,我发现了Ruby 2.x随附的以下PPA

  • 将Ruby 2.1添加到Ubuntu 14.04

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

我还在GoRails中找到了一套在14.04上安装Ruby 的说明,但我猜测是因为他们很长,所以您想要一个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
真的有必要添加一个“个人软件包存档”以便在Ubuntu 14.04中安装Ruby 2.0-假设没有“ Ruby2.0”的软件包可用吗?
aSteve

1
您要求最直接的方法。就是这样,至少直到正式的Ruby 2.x版本出现在软件中心,或者直到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用来在不同的红宝石版本之间切换。这是ruby-switch软件包描述中推荐的方法,并且是在错误737782中进行了讨论的首选方法,因为据说存储库中不应仅存在一个版本的ruby。

在安装ruby2.0软件包时,默认情况下会安装Ruby 2.0,并且不需要其他操作。如果ruby已安装该软件包,建议将其删除。您应该/usr/bin/ruby2.0在系统上有可用的二进制文件。


2
嗯...当我安装ruby2.0软件包时,我得到了ruby2.0可执行文件和ruby 1.9可执行文件。当与gem交互时,ruby1.9似乎是系统的ruby版本。在进一步调查中,我发现这些脚本(虽然声称需要ruby 2.0)实际上在ruby 1.9上运行良好-因此我放弃了ruby2.0软件包。我只想要一个ruby版本-即runy 2.0-但ubuntu 14.04软件包似乎不允许这样做。
aSteve 2014年

Debian中的@aSteve我似乎没有这个问题,通过Ubuntu使用该方法。如果您愿意,可以尝试使用rbenv为ruby 2.0创建虚拟环境,只是为了安全起见。
Braiam 2014年

2
我肯定看到了,这没有任何意义。在apt-get上安装ruby2.0,我得到:将安装以下新软件包:libjs-jquery libruby1.9.1 libruby2.0 ruby​​ ruby​​1.9.1 ruby​​2.0 ruby​​gems-integration
Josh Nankin


1
@jla不,实际上,正如您在changelog中看到的那样,Debian 选择不支持Ruby的多个版本。Debian表示它将仅支持一个版本,而切换版本的工具以某种方式已损坏,这在Debian中或多或少都存在。Ubuntu当时决定不向2.0迈进。
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的),对于用户而言本地或对所有用户而言都是全局的。

我知道您要一个“包装”,所以也许这对您不起作用。但是我认为如果这是您的开发机器可能会有所帮助。

这样做的好处是,您可以为2.1.1安装一个gemset,为2.0或1.9.3安装另一个gemset,等等。它还允许您测试jruby,rubinius等,而无需将系统提交给一个。

我没有在生产中使用它,但显然它既适合开发又适合。

这是快速入门:https : //rvm.io/rvm/install


1

在游戏的后期,但是我认为,也许比硬编码符号链接更完整的解决方案是使用update-alternatives,如果其他人也因同样的挫败感而被咬住,并且想要更本地化的解决方案,请在此处详细发布。这将处理所有二进制文件和手册页,并抢先删除引用以避免冲突。

注意事项:

  • 我认为,如果/当其中一个红宝石版本被更新时,这将需要重新运行。
  • 我不是专家,update-alternatives所以这可能是过大和/或混为一谈。

脚本(我叫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。另一个要注意的是:我将“拼凑”借用。:)
muru 2015年

没错...这几乎是个骇人听闻的骇客。固定。谢谢:-)
r2evans
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.