ruby-on-rails - versiones - rvm install rails
¿Cómo funcionan realmente RVM y rbenv? (5)
Entonces, para resumir las excelentes respuestas anteriores, la principal diferencia práctica entre RVM y rbenv es cuando se selecciona la versión de Ruby.
rbenv:
rbenv agrega una cuña al inicio de tu camino, un comando con el mismo nombre que Ruby. Cuando se escribe ruby
en una línea de comando, la corrección se ejecuta en su lugar (porque también se llama "ruby" y viene primero en la ruta). El shim busca una variable de entorno o .rbenv_version
archivo .rbenv_version
para indicarle a qué versión de Ruby delegar.
RVM:
RVM le permite establecer una versión de Ruby directamente llamando rvm use
. Además, también anula el comando del sistema de cd
. Cuando .rvmrc
en una carpeta que contiene un archivo .rvmrc
, se ejecuta el código dentro del archivo .rvmrc
. Esto se puede usar para establecer una versión de Ruby, o cualquier otra cosa que te apetezca.
Otras diferencias
Por supuesto, hay otras diferencias. RVM tiene gemsets fuera de la caja, mientras que rbenv requiere un poco más de pirateo (pero no mucho). Ambas son soluciones funcionales para el problema.
Estoy interesado en cómo funcionan realmente RVM y rbenv.
Obviamente, cambian entre las diferentes versiones de Ruby y las gemas, pero ¿cómo se logra esto? Supuse que simplemente estaban actualizando enlaces simbólicos, pero habiendo profundizado en el código (y debo admitir que mi conocimiento de Bash es superficial) parecen estar haciendo más que esto.
Escribí un artículo en profundidad: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/
La diferencia básica es donde se cambia el entorno de shell:
- RVM: ha cambiado cuando cambias a Ruby.
- rbenv: ha cambiado cuando ejecutas un ejecutable Ruby / gem.
Además, lo que pasa con RVM es que cubre mucho más que administrar Rubies, tiene mucho más que cualquier otra herramienta (hay otros aparte de RVM y rbenv: https://twitter.com/#!/mpapis/status/171714447910502401 )
No se olvide de la asistencia instantánea que recibe en IRC en el canal "#rvm" en los servidores de Freenode.
La diferencia principal parece ser http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/ . Ruby está cambiado:
- para RVM manualmente (uso rvm) o automáticamente durante el cambio de directorios
- para rbenv automáticamente cada vez que se ejecuta un comando de ruby
RVM se basa en el comando cd
modificado y la selección manual de Ruby por rvm use
. rbenv usa wrappers o "shims" para todos los comandos ruby básicos como mecanismo predeterminado para seleccionar ruby. RVM crea envoltorios para herramientas de línea de comandos básicas como gema, rastrillo, rubí, también. Se usan, por ejemplo, en CronJobs (ver http://rvm.io/integration/cron/ ), pero no son el mecanismo predeterminado para cambiar la versión de Ruby.
Por lo tanto, ambos métodos seleccionan "automáticamente" la versión correcta de Ruby sobrescribiendo los comandos y utilizando envoltorios. rvm anula comandos de shell como cd. rbenv anula todos los comandos básicos de ruby, como ruby, irb, rake y gem.
Breve explicación: rbenv funciona enganchándose en la PATH
su entorno. El concepto es simple, pero el diablo está en los detalles; cuchara completa a continuación.
Primero, rbenv crea cuñas para todos los comandos ( ruby
, irb
, rake
, gem
, etc.) en todas las versiones instaladas de Ruby. Este proceso se llama reafirmante . Cada vez que instales una nueva versión de Ruby o instales una gema que proporcione un comando, ejecuta rbenv rehash
para asegurarte de que todos los nuevos comandos estén ajustados.
Estas cuñas viven en un único directorio ( ~/.rbenv/shims
por defecto). Para usar rbenv, solo necesita agregar el directorio de calzas al frente de su PATH
:
export PATH="$HOME/.rbenv/shims:$PATH"
Entonces, cada vez que ejecutas ruby
desde la línea de comandos o ejecutas un script cuyo shenang lee #!/usr/bin/env ruby
, tu sistema operativo ~/.rbenv/shims/ruby
encontrará ~/.rbenv/shims/ruby
y lo ejecutará en lugar de cualquier otro ruby
ejecutable que puede haber instalado.
Cada shim es un pequeño script de Bash que a su vez ejecuta el rbenv exec
. Entonces con rbenv en su camino, irb
es equivalente a rbenv exec irb
, y ruby -e "puts 42"
es equivalente a rbenv exec ruby -e "puts 42"
.
El comando rbenv exec
averigua qué versión de Ruby desea usar, luego ejecuta el comando correspondiente para esa versión. Así es cómo:
- Si se
RBENV_VERSION
la variable de entornoRBENV_VERSION
, su valor determina la versión de Ruby que se usará. - Si el directorio de trabajo actual tiene un archivo
.rbenv-version
, su contenido se usa para establecer la variable de entornoRBENV_VERSION
. - Si no hay
.rbenv-version
archivo.rbenv-version
en el directorio actual, rbenv busca en cada directorio padre un archivo.rbenv-version
hasta que.rbenv-version
la raíz de su sistema de archivos. Si se encuentra uno, su contenido se usa para establecer la variable de entornoRBENV_VERSION
. - Si
RBENV_VERSION
aún no está configurado, rbenv intenta configurarlo utilizando el contenido del archivo~/.rbenv/version
. - Si no se especifica ninguna versión en cualquier lugar, rbenv asume que desea usar el "sistema" Ruby, es decir, cualquier versión que se ejecute si rbenv no estuviera en su ruta.
(Puede establecer una versión de Ruby específica del proyecto con el rbenv local
, que crea un archivo .rbenv-version
en el directorio actual. De manera similar, el rbenv global
modifica el archivo ~/.rbenv/version
).
Armado con una variable de entorno RBENV_VERSION
, rbenv agrega ~/.rbenv/versions/$RBENV_VERSION/bin
al frente de su PATH
, luego ejecuta el comando y los argumentos pasados a rbenv exec
. Voila!
Para ver a fondo lo que sucede debajo del capó, intente configurar RBENV_DEBUG=1
y ejecute un comando de Ruby. Cada comando de Bash que ejecute rbenv se escribirá en su terminal.
Ahora, rbenv solo se preocupa por cambiar versiones, pero un ecosistema próspero de complementos lo ayudará a hacer todo, desde instalar Ruby hasta configurar su entorno , administrar "conjuntos de gemas" e incluso automatizar el bundle exec
.
No estoy seguro de qué tiene que ver el soporte de IRC con el cambio de las versiones de Ruby, y rbenv está diseñado para ser lo suficientemente simple y comprensible como para no requerir soporte. Pero si alguna vez necesita ayuda, el rastreador de problemas y Twitter están a solo un par de clics de distancia.
Divulgación: soy el autor de rbenv, ruby-build y rbenv-vars.
rvm system
env > before
rvm jruby # or whatever
env > after
diff after before
Te da aproximadamente:
< GEM_HOME=$HOME/.gem/ruby/1.9.1
---
> GEM_HOME=$HOME/.rvm/gems/jruby-1.6.6
< GEM_PATH=$HOME/.gem/ruby/1.9.1
---
> GEM_PATH=$HOME/.rvm/gems/jruby-1.6.6:$HOME/.rvm/gems/jruby-1.6.6@global
*bunch of rvm_*
> MY_RUBY_HOME=$HOME/.rvm/rubies/jruby-1.6.6
> RUBY_VERSION=jruby-1.6.6
> IRBRC=$HOME/.rvm/rubies/jruby-1.6.6/.irbrc
Y precede:
$HOME/.rvm/gems/jruby-1.6.6/bin:$HOME/.rvm/gems/jruby-1.6.6@global/bin
a $PATH