2011-04-09 14 views
22

Una cosa que RVM puede hacer es notar cuando ha cambiado directorios, busque un .rvmrc, y cambie su versión actual de Ruby y su gemset de acuerdo con el contenido de ese archivo. Hace este cambio tan pronto como cambias a ese directorio y emite un mensaje en consecuencia.¿Cómo detecta RVM cuando ha cambiado directorios?

¿Cómo detecta un cambio en el directorio de trabajo actual? Puedo imaginar una manera extremadamente cruda de hacer esto: ejecutar un daemon que se ejecuta como el usuario actual y sigue revisando los resultados de pwd. Pero estoy seguro de que eso no es lo que hace.

Otro enfoque podría ser alias cd para cambiar los directorios, pero también para comprobar .rvmrc y cambiar las gemas si así se indica.

¿Hay un gancho de sistema Unix para cambiar directorios, o hay algún otro truco que esté utilizando RVM?

+1

Dado que pwd es por proceso, no por usuario, no creo que el daemon funcione. –

+0

@TomAnderson Absolutamente correcto. Estaba confundido acerca del concepto. :) –

+0

Por cierto, ahora estoy usando chruby, y he [personalizado su comportamiento de monitoreo de directorios para adaptarme a mi uso en zsh] (http://nathanmlong.com/2015/01/optimizing-chruby-for-zsh/) –

Respuesta

26

¿Cómo [RVM] detecta un cambio en el directorio de trabajo actual?

Esto depende por completo de la versión del armazón y hasta del armazón. El método más simple para lograr esto es, como se sugirió, anular cd definiendo una función del mismo nombre. Asegúrese de llamar a la función incorporada cd o causará muy desagradable o muy efectos secundarios divertidos (según la perspectiva).

cd() { 
    builtin cd $* 
    echo "Changed directories from '${OLDPWD}' to '${PWD}'." 
} 

Al colocar esto en un archivo fuente de abastecimiento de texto y el archivo que se puede cargar esta funcionalidad personalizada cd en la sesión de abastecimiento del archivo.

wayneeseguin$ cd /tmp 
Changed directories from '/home/wayneeseguin' to '/tmp'. 

Si lo desea estar siempre en efecto para shells interactivos en su cuenta de usuario o bien colocar la definición de función en ~/.bash_profile. Alternativamente, puede obtener el archivo de texto en el que almacenó la función desde ~/.bash_profile. Puede read more about Bash startup files en el manual de Bash.

The Ruby enVironment Manager (RVM) está escrito y apuntado principalmente para el Bash shell.RVM funcionará en el ZSH shell que le permite agregar llamadas a funciones después de una acción cd. Esta es, de lejos, la mejor manera de abordar la solución de esta tarea. Entonces, si tu caparazón lo permite, usa este método. RVM lo hace.

Para un amplio ejemplo, puede look at RVM's cd functionality on GitHub.

RVM utiliza esta funcionalidad para cargar per-project (directory, really) .rvmrc files y proporciona a los usuarios la posibilidad de configurar varios ganchos. Puede leer más sobre RVM's hooks on the documentation website.

+0

Impresionante - ¡gracias por responder mi pregunta! –

0

¿Simplemente mira el directorio actual cada vez que necesita resolver los contenidos del gemset? ¿Hay algo que te haga pensar que está haciendo esto en paralelo con el cambio de directorios, en lugar de a pedido?

+0

Aclaré mi pregunta: tan pronto como me cambio a un directorio de proyectos que usa un '.rvmrc', cambia mi versión actual de Ruby y gemset y muestra un mensaje que dice lo que está usando ahora. –

+0

Ya veo. ¡Es un comportamiento ingenioso pero aterrador! –

4

Al instalar RVM hay que añadir:

[[-s $ HOME/.rvm/scripts/RVM]] & & fuente $ HOME/.rvm/scripts/RVM

a su configuración de shell (generalmente .bashrc o .zshrc).

Esto carga RVM cuando se inicia un shell que luego anula el comando cd y comprueba si hay .rvmrc s mientras se mueve. Vea los contenidos de $HOME/.rvm/scripts/cd para más detalles.

+0

La instalación de RVM para mí hizo esto automáticamente, para .bash_profile – Bogatyr

Cuestiones relacionadas