¿Usar rake ejecutivo de paquete o simplemente rake?

81

Aprendí Rails usando solo el comando rake como rake db:migrate; sin embargo, leí que debería usar el en bundle exec rake ...lugar de simplemente simple rake. Ahora estoy confundido sobre cuál usar.

¿Debería usarlo en bundle exec rakelugar de simplemente rakeo es solo una cuestión de preferencia? ¡Cualquier idea sería muy apreciada! ¡Gracias!

agentbanks217
fuente

Respuestas:

126

bundle exec ejecuta un comando en el contexto de su paquete.

Eso significa que usa las gemas especificadas en su Gemfile. La mayor parte del tiempo, la ejecución bundle exec rake footiene los mismos resultados que si acabara de ejecutar rake foo, especialmente si tiene las mismas gemas instaladas en todo el sistema que en su Gemfile. Sin embargo, algunas aplicaciones pueden especificar versiones de gemas diferentes a las que ha instalado en todo el sistema, y ​​es posible que deseen que esas gemas y versiones exactas se puedan ejecutar correctamente. Si simplemente ejecuta sin bundle exec, puede obtener algunos errores extraños.

El uso bundle execgarantiza que el programa se ejecuta con el entorno especificado en el archivo de gemas, lo que con suerte significa que es el entorno en el que los creadores del programa quieren que se ejecute, lo que con suerte significa que debería ejecutarse correctamente sin importar la configuración extraña que tenga en tu computadora.

Básicamente, estandariza el entorno en el que se ejecuta el programa. Esto ayuda a evitar el infierno de versiones y hace la vida mucho más fácil.

Consulte http://bundler.io/v1.3/man/bundle-exec.1.html para obtener más información.

jergason
fuente
4
Si se cansa de escribir paquete ejecutivo todo el tiempo, puede configurar rvm para que no sea necesario: ruby.railstutorial.org/chapters/…
Lance Fisher
1
Nota: La página del manual de Bundle cambió, la correcta a esta fecha es: bundler.io/v1.3/man/bundle-exec.1.html
Americo Savinon
1
Un buen efecto secundario del uso bundle execes que también le dirá si debe ejecutar bundle installpara instalar versiones de gemas que le faltan en comparación con el archivo Gemfile.lock.
Jay Mitchell
Lo habéis explicado muy bien .. Gracias.
Arup Rakshit
5

$ bundle exec rake db: migrate
Utiliza la versión de rake especificada en el Gemfile para ejecutar la tarea de rake db:migrate.

¡Pero no hay ninguna gema de comisión especificada en el Gemfile!
Sí, pero se instaló una gema de rastrillo como dependencia de alguna otra gema: busque en Gemfile.lock. Entonces la regla debe ser: Usa la versión de rake especificada en Gemfile.lock.

Pero Gemfile.lock no especifica una versión específica, ¡especifica una versión mayor que xy!
Entonces la regla debe ser: Utiliza la versión de rake que se instaló en el conjunto de gemas actual.

$ rake db: migrate
Normalmente, cuando emite un comando en la línea de comandos, por ejemplo, rake, su sistema busca el comando en la lista de directorios especificados en su variable de entorno PATH. El primer directorio que contiene el comando es la versión del comando que se utiliza. Para ver qué directorio es, puede hacer:

$ which rake

Entonces, si ejecuta,

$ rake db:migrate

que puede usar una gema de rastrillo diferente a la que instaló bundle install. Pero, incluso si su sistema encuentra la misma versión de rastrillo que bundle exec, cualquier gema requerida por el código fuente de rastrillo se buscará en lugares fuera del conjunto de gemas de su proyecto. Por lo tanto, hay muchas formas en las que simplemente:

$ rake db:migrate

puede arruinar las cosas.

De acuerdo con el libro de tutoriales de Ruby on Rails (gratis en línea), sección 3.6, si está utilizando rvm 1.11.x +, entonces no necesita comenzar los comandos con bundle exec.

7stud
fuente
1

ejecutar cualquier exacutable sin bundle exechará que Rubygems obtenga la última versión de la gema instalada en su sistema.

Al agregar el bundle execprefijo, el ejecutable se ejecutará en el contexto de su Gemfile.lock, lo que significa que se ejecutará utilizando la versión definida en el archivo de gema.

pastullo
fuente