在rbenv中复制以前版本的Ruby中的gem

Ara*_*shM 18 ruby rbenv

我用rbenv安装了Ruby 1.9.3-p286.现在,在安装了较新版本(p327)之后,很明显,它对以前版本安装的GEM一无所知.

是否可以将Gems从该版本复制到较新版本,以便不再需要将它们全部下载?

小智 29

你可以复制gems/bin/文件夹,但这会导致麻烦.
文件中bin/包含硬编码路径.

我建议改为重新安装它们,如下所示:

$ rbenv local 1.9.3-p286
$ gem list | cut -d" " -f1 > my-gems
$ rbenv local 1.9.3-p327
$ gem in $(cat my-gems)
Run Code Online (Sandbox Code Playgroud)

  • 很好,谢谢!顺便说一下,`gem list --no-versions`比剪切更简单.如果列出宝石的方式发生变化,它可能会在未来兼容. (5认同)
  • 更好的方法是在主文件夹中保留`Gemfile`,安装新版本时,只需在其上安装`bundler`即可.然后你只需在你的主文件夹中执行`bundle install` :) (2认同)

Aus*_*ler 7

我一直在从升级和重新安装的角度来看这个,而不下载.这不是微不足道的,我建议你做一些宝石的清理,以尽量减少需要完成的处理/安装量(例如,我安装了五个版本的ZenTest;在这之前我做了'gem cleanup ZenTest').但要小心'gem cleanup',因为它删除了除LAST版本以外的所有版本:如果你需要支持旧版本的Rails,请手动清理你不需要的版本.

我将此脚本称为"migrate-gems.sh":

#! /bin/bash

if [ ${#} -ne 2 ]; then
  echo >&2 Usage: $(basename ${0}) old-version new-version
  exit 1
fi

home_path=$(cd ~; pwd -P)
old_version=${1}
new_version=${2}

rbenv shell ${old_version}

declare -a old_gem_paths old_gems
old_gem_paths=($(gem env gempath | sed -e 's/:/ /'))

rbenv shell ${new_version}

for ogp in "${old_gem_paths[@]}"; do
  case "${ogp}" in
    ${home_path}/.gem/ruby*|*/.gem/ruby*)
      # Skip ~/.gem/ruby.
      continue
      ;;
  esac

  for old_gem in $(ls -1 ${ogp}/cache/*.gem); do
    gem install --local --ignore-dependencies ${ogp}/cache/${old_gem}
  done
done
Run Code Online (Sandbox Code Playgroud)

这项工作有三个部分:

  1. gem env gempath包含:安装gem 的路径(-separated).因为宝石在〜/ .gem/ruby​​中共享,所以我跳过这个.
  2. gem install接受--local,强制没有网络连接.
  3. gem install接受--ignore-dependencies,禁用依赖性检查.

我有一个相当大的宝石列表今天要移动,我不想从rubygems.org下载(加上,我需要旧版本),所以我很快就掀起了这个.