不使用 ruby​​-switch 来安装 ruby​​ 2.0?

不使用 ruby​​-switch 来安装 ruby​​ 2.0?

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

我在 13.10 上发现了有关 ruby​​ 的这个疑问/答案 - 它看起来正是我想要的。

如何安装 ruby​​?

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

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

删除包引用一个错误在我看来,这完全不相关。

我很困惑为什么使用 apt-get 安装 ruby​​2.0 会安装 ruby​​1.9 并使其成为默认的 ruby​​ 解释器。我确实获得了 ruby​​2.0 二进制文件 - 但脚本(在执行 ruby​​ 时依赖于 2.0 解释器)没有选择它。此外,当我使用 gem 等安装 ruby​​ 包时 - 这些包似乎是为 ruby​​1.9 而不是 2.0 安装的。非常不令人满意。

有人能提供一些提示,说明如何以最直接的方式安装 ruby​​ 2.0 作为标准 ruby​​ 解释器吗?如果没有 ruby​​-switch,我该如何从 ruby​​ 1.9 切换到 2.0?

答案1

对于 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。

  • 向 Ubuntu 14.04 添加 Ruby 1.9、2.0 或 2.1

    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

答案2

Debian 版本的 Ruby 不支持在同一系统上安装多个 ruby​​。Debian 已淘汰该软件包Ubuntu 刚刚删除了它从存储库。您应该使用rbenv在不同的 ruby​​ 版本之间切换。这是 ruby​​-switch 包描述中推荐的方法,也是在错误 737782作为首选,尽管据说存储库中不应该只有一个版本的 ruby​​。

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

答案3

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

答案4

虽然已经到了后期,但我认为比硬编码符号链接更完整的解决方案是使用update-alternatives,这里详细发布以防其他人遇到同样的挫折并希望获得更原生的解决方案。这将处理所有二进制文件和手册页,先行删除引用以避免冲突。

注意事项:

  • 我认为当其中一个 ruby​​ 版本更新时需要重新运行此操作。
  • 我并不是一名专家,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

相关内容