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:
-
gem env gempath
contiene las rutas (:
-separated) donde se instalan las gemas. Debido a que las gemas se comparten en ~ / .gem / ruby, omito esta. -
gem install
acepta--local
, que no fuerza las conexiones de red. -
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)