rehash ruby rbenv

rehash - Copiando gemas de la versión anterior de Ruby en rbenv



rbenv list (3)

He estado viendo esto específicamente desde la perspectiva de actualizar y reinstalar sin descargar. No es trivial, y te recomiendo que hagas un poco de limpieza de tus gemas para minimizar la cantidad de procesamiento / instalación que se necesita hacer (p. Ej., Tenía cinco versiones de ZenTest instaladas; hice "gema de limpieza ZenTest" antes de hacer esto). Sin embargo, tenga cuidado con la "limpieza de gemas", ya que elimina todas las versiones excepto la ÚLTIMA: si necesita admitir una versión anterior de Rails, limpie manualmente las versiones que no necesita.

Llamé a este script ''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

Hay tres piezas que hacen este trabajo:

  1. gem env gempath contiene las rutas ( : -separated) donde se instalan las gemas. Debido a que las gemas se comparten en ~ / .gem / ruby, omito esta.
  2. gem install acepta --local , que no fuerza las conexiones de red.
  3. gem install acepta --ignore-dependencies , que deshabilita la verificación de dependencias.

Tenía una lista bastante grande de gemas para moverme hoy y no quería descargar de rubygems.org (además, necesitaba versiones más antiguas), así que hice esto rápidamente.

Instalé Ruby 1.9.3-p286 con rbenv. Ahora, después de instalar una versión más nueva (p327), obviamente, no se sabe nada acerca de los GEM instalados con la versión anterior.

¿Es posible copiar gemas de esa versión a la nueva, para que no sea necesario descargarlas todas de nuevo?


Para la posteridad, escribí rbenv-copy-gems.sh para ayudarme a hacer esto. No cumple con los criterios de esta pregunta (se instala desde Internet, no localmente), pero me ha resultado útil cuando actualizo o instalo una nueva versión de Ruby a través de la instalación rbenv.

Versión actual pegada a continuación como referencia, pero mantengo la información actualizada a medida que hago mejoras.

#!/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


Puedes copiar gems/ y bin/ carpetas, pero esto te llevará a problemas.
Los archivos en bin/ tiene rutas codificadas en ellos.

Yo recomendaría en su lugar reinstalarlos de esta manera:

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