我发现在最新的 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 等安装 ruby 包时 - 这些包似乎是为 ruby1.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