安装ruby 2.0没有ruby-switch?

我发现在最新的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 installs ruby​​1.9安装ruby2.0并使其成为默认的ruby解释器。 我确实得到了一个ruby2.0二进制文件 – 但脚本(在执行ruby时依赖于2.0解释器)不会接受它。 此外,当我使用gem et。 人。 安装ruby软件包 – 这些似乎是为ruby1.9而不是2.0安装的。 非常不满意。

任何人都可以提供关于安装ruby 2.0作为标准ruby解释器的最直接方式的提示吗? 如果没有ruby-switch,我怎么能从ruby 1.9切换到2.0?

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

Debian版本的Ruby不支持在同一系统上安装多个ruby。 Debian废弃了包 , Ubuntu刚从存储库中删除它 。 您应该使用rbenv在不同的ruby版本之间切换。 这是ruby-switch软件包描述的推荐方法,并且是bug 737782中讨论的首选方法,通过它说存储库中不应该只有一个版本的ruby。

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

 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 

如果你想在ruby之间切换,我建议使用rvm( https://rvm.io )。 它是一个包管理器,它允许您在一台机器上安装许多不同的ruby(不仅仅是Matz),无论是本地用户还是全局用户。

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

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

我不是在生产中使用它,但显然它适用于那个以及开发。

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

在游戏的后期,但我认为一个可能比硬编码符号链接更完整的解决方案就是使用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