2011-04-26 10 views
12

(véase la actualización en la parte inferior)No se puede cambiar RVM gemset de script de shell a través de `RVM gemset use`


siento que me falta algo terriblemente obvia aquí, pero no puedo cambiar desde dentro gemsets un guion de shell Este script mínima demuestra:

#!/usr/bin/env bash 

rvm gemset use "testing" 

Incluso probé las instrucciones del Scripting RVM page (aunque no parecía necesario):

#!/usr/bin/env bash 

# Load RVM into a shell session *as a function* 
if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then 
    # First try to load from a user install 
    source "$HOME/.rvm/scripts/rvm" 
elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then 
    # Then try to load from a root install 
    source "/usr/local/rvm/scripts/rvm" 
else 
    printf "ERROR: An RVM installation was not found.\n" 
fi 

rvm gemset use "testing" 

sigue sin ir.

Curiosamente, si intento ejecutar el script sin crear primero el gemset "testing", obtengo ERROR: Gemset 'testing' does not exist, rvm gemset create 'testing' first. Sin embargo, si creo el gemset y luego ejecuto el script, no obtengo ningún resultado del script y el gemset es no cambiado (de acuerdo con rvm info). Puedo realizar otras acciones de gemset RVM, como crear conjuntos de valores y confiar en los archivos .rvmrc, desde el script.

[Actualización]

Por supuesto, el medio ambiente es cambiante, como se indica por una llamada a rvm info desde el script. ¿Cómo consigo que estos cambios persistan/afecten al intérprete de comandos de llamada? O, si eso no es posible (como se indica en here), ¿hay alguna forma de establecer el gemset RVM actual en función de la entrada de un script?

+0

Su título muestra que usa las comillas inversas. ¿Realmente los estás usando? ¿Sabes que eso significa sustitución de comando? cualquier salida de ese comando debería tener la forma de varName = valor para ser útil (más lo más probable, una evaluación anterior). ¡Buena suerte! – shellter

+0

No, no lo estoy, solo los usé en el título para indicar un comando. –

Respuesta

19

tenía exactamente el mismo problema, y ​​aquí está la solución:

#!/bin/bash 

# IMPORTANT: Source RVM as a function into local environment. 
#   Otherwise switching gemsets won't work. 
[ -s "$HOME/.rvm/scripts/rvm" ] && . "$HOME/.rvm/scripts/rvm" 

# Enable shell debugging. 
set -x 

rvm [email protected]_a 
rvm gemdir 
gem env gemdir 

rvm [email protected]_b 
rvm gemdir 
gem env gemdir 

Lo que he descubierto es que el intérprete de comandos interactivo tiene rvm() y sus ayudantes, mientras que el entorno del guión no ha los tengo. rvm binario se ejecuta en su lugar, parcialmente funcionando y, por tanto, causando cierta confusión.

+0

Gracias! ¡Esto me estaba matando con mi despliegue de Jenkins/Capistrano! ¡Estaba tan confundido! Aclamaciones. – Harmon

+0

Gracias! Esto también ayudó a solucionar un problema por el que cambiar la versión de Ruby (por ejemplo, "sistema rvm") no funcionaba dentro de un script. –

+0

'#!/Bin/bash --login' también hará el truco si no quiere tener que agregar' [-s "$ HOME/.rvm/scripts/rvm"] &&. "$ HOME/.rvm/scripts/rvm" ' – Brandt

1

Terminé implementando la funcionalidad que quería como función en lugar de un script de shell.

function rvmrc { 
    rvm gemset create $1 
    rvm gemset use $1 
    echo "rvm gemset use $1" > .rvmrc 
    rvm rvmrc trust 
} 
+0

Gracias - esto resuelve un montón de problemas para mí y se puede utilizar con otras cosas. ¡Parece obvio cuando lo muestras aquí pero he estado jugando con esto por horas! –

Cuestiones relacionadas