簡體   English   中英

在 rbenv 中從以前版本的 Ruby 復制 gem

[英]Copying gems from previous version of Ruby in rbenv

我用 rbenv 安裝了 Ruby 1.9.3-p286。 現在,在安裝更新版本 (p327) 之后,很明顯,它對之前版本安裝的 GEM 一無所知。

是否可以將 Gems 從那個版本復制到新版本,這樣就不需要再次下載它們了?

您可以復制gems/bin/文件夾,但這會導致問題。 bin/中的文件在其中具有硬編碼路徑。

我建議重新安裝它們,就像這樣簡單:

$ rbenv local 1.9.3-p286
$ gem list | cut -d" " -f1 > my-gems
$ rbenv local 1.9.3-p327
$ gem install $(cat my-gems)

我一直是專門從升級重裝不下載的角度來看這個的。 這不是微不足道的,我建議您對 gem 進行一些清理,以最大程度地減少需要完成的處理/安裝量(例如,我安裝了五個版本的 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

完成這項工作需要三個部分:

  1. gem env gempath包含安裝 gems 的路徑(以:分隔)。 因為 gems 在 ~/.gem/ruby 中共享,所以我跳過這個。
  2. gem install接受--local ,它強制沒有網絡連接。
  3. gem install接受--ignore-dependencies ,它禁用依賴檢查。

我今天有相當多的 gem 列表要移交,我不想從 rubygems.org 下載(另外,我需要舊版本),所以我很快就把它搞定了。

為了后代,我寫了rbenv-copy-gems.sh來幫助我做到這一點。 它不符合這個問題的標准(它是從 Internet 安裝的,而不是本地安裝的),但是當我通過 rbenv install 升級或安裝新版本的 Ruby 時,它對我很有用。

下面粘貼當前版本以供參考,但我在進行改進時會及時更新要點。

#!/bin/bash
# copy is a misnomer; it's actually LIST + INSTALL
# --from 2.2.1 [--to other-version-else-whatever-is-currently-set]
#
# TODO: install only most-recent version that's installed in FROM
# TODO: use gem names only from FROM, install latest available version (might be more recent than in FROM)
# TODO: pass arguments to gem command (e.g. --no-document)

CURRENT_VERSION=`rbenv version | cut -d' ' -f1`
GEM_LIST_ARGS="--local"

while [[ $# -gt 0 ]]; do
  option="$1"

  case $option in
    --from)
    FROM="$2"
    shift
    ;;
    --to)
    TO="$2"
    shift
    ;;
  esac
  shift # past argument or value
done

if [ -z "${FROM}" ]; then
  FROM="${CURRENT_VERSION}"
fi

if [ -z "${TO}" ]; then
  TO="${CURRENT_VERSION}"
fi

echo ">>> Install gems from v${FROM} to v${TO}"

# Get gems and versions, reformat to GEMNAME:version[,version[...]]
gems=(`RBENV_VERSION=${FROM} gem list ${GEM_LIST_ARGS} | sed -e 's/[\(\)]//g' -e 's/, /,/g' -e 's/ /:/'`)

for geminfo in "${gems[@]}"; do
  gem=`echo $geminfo | cut -d: -f1`
  versions=(`echo $geminfo | sed -e 's/^.*://' -e 's/,/ /g'`)
  for version in "${versions[@]}"; do
    installed=`RBENV_VERSION=${TO} gem query -i $gem -v $version`
    if [ "${installed}" == "false" ]; then
      echo ">>> Installing ${gem} ${version}:"
      RBENV_VERSION=${TO} gem install $gem -v $version
    else
      echo ">>> ${gem} ${version} already installed"
    fi
    echo ""
  done
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM