Ya has activado X, pero tu Gemfile requiere Y

128

Al ejecutar rakeme sale este error:

Ya has activado el rastrillo 0.9.2, pero tu Gemfile requiere el rastrillo 0.8.7. Considere usar el paquete exec.

Usar en bundle exec rakelugar de simplemente rakeparece funcionar, pero ¿es la mejor manera de solucionarlo?

ming yeow
fuente
Esto también es lo que hace que RVM sea ​​una herramienta tan excelente. Le permitiría tener un conjunto separado de gemas para cada uno de estos proyectos para que no tenga que preocuparse de que esto vuelva a suceder.
rm-rf

Respuestas:

84

Usar bundle exec es la forma correcta de hacer esto.

Básicamente, lo que sucede es que has actualizado rake a 0.9.2, que ahora entra en conflicto con la versión especificada en tu Gemfile. Anteriormente, la última versión de rakeusted coincidía con la versión en su Gemfile, por lo que no recibió ninguna advertencia cuando simplemente la usó rake.

Yehuda Katz (uno de los desarrolladores originales de Bundler) lo explica todo en esta publicación de blog .

Para evitar escribir bundle exec ...todo el tiempo, puede configurar un alias o función en su shell para los comandos que usa comúnmente con Bundler. Por ejemplo, esto es lo que uso para Rake:

$ type bake
bake is a function
bake () 
{ 
    bundle exec rake "$@"
}
mate
fuente
55
La publicación del blog realmente no explica mucho. La verdadera pregunta es: ¿por qué el rubí virgen no obtiene las dependencias correctas y por qué se queja de tener las incorrectas?
Oteo
64

Si tienes una razón para mantener la versión actual del rastrillo (o cualquier otra gema que esté causando el problema), Matt es correcto, la mejor manera de hacerlo es correr bundle exec. Esto usa la versión especificada en su Gemfile en lugar de usar la versión más reciente de la gema que ha instalado. (nathan.f77 tiene una buena solución a continuación si no desea escribir bundle execcada vez que ejecuta rake)

De lo contrario, si no hay ninguna razón para no actualizar rake, puede ejecutar

bundle update rake

Esto realmente actualizará su Gemfile.lock para usar la versión más nueva de rake en lugar de tener que ejecutar bundle exec cada vez.

Nota: si corres solobundle update esto, actualizará todas las gemas en su Gemfile en lugar de solo rake, lo que probablemente no sea lo que desea, porque si algo se rompe en su aplicación, no sabrá qué actualización de gemas lo causó.


La forma menos recomendada de mantener la versión anterior sin tener que usar bundle exec es desinstalar las versiones más nuevas de rake.

rastrillo de desinstalación de $ gem

Seleccione gema para desinstalar:
 1. rastrillo-0.8.7
 2. rastrillo-0.9.2
 3. Todas las versiones
> 2
Desinstalado correctamente rake-0.9.2

Esto funciona, pero si está trabajando con varias aplicaciones que usan diferentes versiones de rake, esto puede ser un problema porque constantemente tendrá que instalar y desinstalar diferentes versiones.

Ryan
fuente
Esto funcionó para mí. Por alguna razón, solo había una versión (0.8.7) instalada. Así que primero lo hice gem install rake. Luego gem uninstall rakey eligió 0.9.2.
B Seven
77
bundle updatetambién actualizará cualquier gema sin versiones especificadas a la última versión disponible. Eso puede no ser lo que quieres. bundle update rakeSería más precies.
Alex Neth
Tengo el mismo problema con en public_suffixlugar de rake. Correr bundle update public_suffixno tiene ningún efecto, desafortunadamente.
Dmitri Zaitsev
53

Tratar bundle clean --force

Elimina todas las gemas del sistema que no están en este paquete

Oleg Dikusar
fuente
13

La última vez que me sucedió esto, actualicé todas mis gemas. Hice una gem uninstall rakey enumeró las opciones de versión. Elegí el más nuevo, y luego no tuve que usar bundle execmás.

Básicamente, si lo usa bundle exec, usa cualquier versión de gema instalada por su paquete, entonces, ¿qué hay en el Gemfile? Sin bundle execél, utiliza cualquier versión que sea la predeterminada de su sistema.

paarshad
fuente
8

¡Oh! ¡El artículo de Katz es excelente!

Me gusta esta solución lo mejor:

bundle install --binstubs

para que ahora puedas escribir

bin/rake .stuff.

Para alguien como yo que está desarrollando aplicaciones 2.3 y 3.0.9, esto me hace sentir mucho mejor.

Nessur
fuente
8

bundle exec es correcto, pero no quieres escribirlo todo el tiempo.

Puedes poner esto en tu .bashrc:

# Automatically invoke bundler for rake, if necessary.
rake() { if [ -e ./Gemfile.lock ]; then bundle exec rake "$@"; else /usr/bin/env rake "$@"; fi; }
ndbroadbent
fuente
Para aclarar, el archivo .bashrc probablemente se encuentre en su directorio de inicio [~ / .bashrc]. Este archivo se carga cada vez que abre una nueva ventana de terminal.
Ryan
0

Otra forma de no escribirlo todo el tiempo es con un Makefile, por ejemplo

rake :
    bundle exec rake
qwr
fuente