Breve explicación: rbenv funciona conectándose a su entorno PATH
. El concepto es simple, pero el diablo está en los detalles; cucharada completa a continuación.
En primer lugar, crea rbenv cuñas para todos los comandos ( ruby
, irb
, rake
, gem
etc.) a través de todas sus versiones instaladas de Ruby. Este proceso se llama rehashing . Cada vez que instale una nueva versión de Ruby o instale una gema que proporcione un comando, ejecute rbenv rehash
para asegurarse de que los comandos nuevos se bloqueen.
Estas cuñas viven en un solo directorio ( ~/.rbenv/shims
por defecto). Para usar rbenv, solo necesita agregar el directorio de cuñas al frente de su PATH
:
export PATH="$HOME/.rbenv/shims:$PATH"
Luego, cada vez que ejecute ruby
desde la línea de comandos, o ejecute un script cuyo shebang lea #!/usr/bin/env ruby
, su sistema operativo lo encontrará ~/.rbenv/shims/ruby
primero y lo ejecutará en lugar de cualquier otro ruby
ejecutable que haya instalado.
Cada cuña es un pequeño script Bash que a su vez se ejecuta 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 rbenv exec
comando determina qué versión de Ruby desea usar, luego ejecuta el comando correspondiente para esa versión. Así es cómo:
- Si se establece la
RBENV_VERSION
variable de entorno, su valor determina la versión de Ruby que se utilizará.
- Si el directorio de trabajo actual tiene un
.rbenv-version
archivo, su contenido se usa para establecer la RBENV_VERSION
variable de entorno.
- Si no hay ningún
.rbenv-version
archivo en el directorio actual, rbenv busca en cada directorio padre un .rbenv-version
archivo hasta que llegue a la raíz de su sistema de archivos. Si se encuentra uno, su contenido se utiliza para establecer la RBENV_VERSION
variable de entorno.
- Si
RBENV_VERSION
aún no está configurado, rbenv intenta configurarlo utilizando el contenido del ~/.rbenv/version
archivo.
- Si no se especifica ninguna versión en ninguna parte, rbenv supone que desea utilizar el "sistema" de Ruby, es decir, cualquier versión que se ejecute si rbenv no estuviera en su camino.
(Puede establecer una versión de Ruby específica del proyecto con el rbenv local
comando, que crea un .rbenv-version
archivo en el directorio actual. Del mismo modo, el rbenv global
comando modifica el ~/.rbenv/version
archivo).
Armado con una RBENV_VERSION
variable de entorno, rbenv se agrega ~/.rbenv/versions/$RBENV_VERSION/bin
al frente de su PATH
, luego ejecuta el comando y los argumentos pasados rbenv exec
. Voila!
Para una mirada completa a lo que sucede exactamente debajo del capó, intente configurar RBENV_DEBUG=1
y ejecutar un comando Ruby. Cada comando Bash que rbenv ejecuta se escribirá en su terminal.
Ahora, rbenv solo se preocupa por cambiar las versiones, pero un próspero ecosistema de complementos lo ayudará a hacer todo, desde instalar Ruby hasta configurar su entorno , administrar "gemas" e incluso automatizarbundle exec
.
No estoy muy seguro de qué tiene que ver el soporte de IRC con el cambio de versiones de Ruby, y rbenv está diseñado para ser simple y lo suficientemente 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.
Escribí un artículo en profundidad: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/
La diferencia básica es dónde se cambia el entorno de shell:
Además, lo que pasa con RVM es que cubre mucho más que solo administrar Rubies, tiene mucho más que cualquier otra herramienta (hay otros aparte de RVM y rbenv: https://twitter.com/#!/mpapis/ estado / 171714447910502401 )
No olvide el soporte instantáneo que obtiene en IRC en el canal "#rvm" en los servidores Freenode.
fuente
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 su ruta, un comando con el mismo nombre que Ruby. Cuando escribe
ruby
en una línea de comando, la cuña se ejecuta en su lugar (porque también se llama "ruby" y aparece primero en la ruta). La cuña busca una variable de entorno o.rbenv_version
archivo para indicarle a qué versión de Ruby delegar.RVM:
RVM le permite configurar una versión de Ruby directamente llamando
rvm use
. Además, también anula elcd
comando del sistema. Cuando ingresacd
a una carpeta que contiene un.rvmrc
archivo,.rvmrc
se ejecuta el código dentro del archivo. Esto se puede usar para configurar una versión de Ruby, o cualquier otra cosa que desee.Otras diferencias
Por supuesto, hay otras diferencias. RVM tiene conjuntos de gemas listos para usar, mientras que rbenv requiere solo un poco más de pirateo (pero no mucho). Ambas son soluciones funcionales al problema.
fuente
La principal diferencia parece ser cuándo y cómo se cambia el rubí . Ruby se cambia:
RVM se basa en el
cd
comando modificado y la selección manual de Ruby porrvm use
. rbenv usa envoltorios o "cuñas" para todos los comandos básicos de ruby como el mecanismo predeterminado para seleccionar ruby. RVM crea envoltorios para herramientas básicas de línea de comandos como gema, rastrillo, rubí, también. Se utilizan, por ejemplo, en CronJobs (consulte 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 los comandos de shell como cd. rbenv anula todos los comandos básicos de ruby como ruby, irb, rake y gem.
fuente
Te da aproximadamente:
Y antecede:
a
$PATH
fuente