Breve explicación: rbenv funciona enganchándose a PATH
de su entorno. El concepto es simple, pero el diablo está en los detalles; cuchara completa a continuación.
En primer lugar, crea rbenv cuñas para todos los comandos (ruby
, irb
, rake
, gem
y así sucesivamente) en todas sus versiones instaladas de Ruby. Este proceso se llama reformulando. 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 todos los nuevos comandos estén ajustados.
Estas calzas viven en un solo directorio (~/.rbenv/shims
por defecto). Para utilizar rbenv, sólo tiene que añadir el directorio de cuñas para el frente de su PATH
:
export PATH="$HOME/.rbenv/shims:$PATH"
Entonces, cualquier vez que se ejecuta ruby
desde la línea de comandos, o ejecutar una secuencia de comandos cuya tinglado lee #!/usr/bin/env ruby
, el sistema operativo se encuentra ~/.rbenv/shims/ruby
primero y ejecútelo en lugar de cualquier otro ejecutable ruby
que pueda haber instalado.
Cada shim es un pequeño script Bash que a su vez 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 comando rbenv exec
determina qué versión de Ruby desea usar, luego ejecuta el comando correspondiente para esa versión. Aquí se explica cómo:
- Si se establece la variable de entorno
RBENV_VERSION
, su valor determina la versión de Ruby que se utilizará.
- Si el directorio de trabajo actual tiene un archivo
.rbenv-version
, su contenido se usa para establecer la variable de entorno RBENV_VERSION
.
- Si no hay un archivo
.rbenv-version
en el directorio actual, rbenv busca en cada directorio principal un archivo .rbenv-version
hasta que llegue a la raíz de su sistema de archivos. Si se encuentra uno, su contenido se usa para establecer la variable de entorno RBENV_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 utilizar el "sistema" Ruby-i.e. cualquiera que sea la versión se ejecutará si rbenv no estuviera en su camino.
(Se puede establecer una versión específica para el proyecto de Ruby con el comando rbenv local
, lo que crea un archivo .rbenv-version
en el directorio actual. Del mismo modo, el comando rbenv global
modifica el archivo ~/.rbenv/version
.)
Armado con un RBENV_VERSION
variable de entorno, 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 una visión detallada de lo que ocurre exactamente 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 sólo se preocupa con las versiones de conmutación, sino un próspero ecosistema de plugins le ayudará a hacer todo lo installing Ruby-setting up your environment, managing "gemsets" e incluso automating 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 necesitar 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.
Gracias por tomarse el tiempo para dar una respuesta tan excelente. – superluminary
Guau, gracias por una explicación comprensible y comprensible. Un maestro nacido natural. – racl101
parece que .ruby-version también lo haría. – alexzg