¿Usar bundle exec rake o simplemente rake?


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

¿Debería usar bundle exec rake en lugar de simplemente rake o es solo una cosa de preferencia? Cualquier idea sería muy apreciada! ¡Gracias!

Author: mbigras, 2011-11-26

3 answers

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, ejecutar bundle exec rake foo tiene los mismos resultados que si acabas de ejecutar rake foo, especialmente si tienes las mismas gemas instaladas en todo el sistema que en tu Gemfile. Sin embargo, algunas aplicaciones pueden especificar diferentes versiones de gemas que las que ha instalado en todo el sistema, y pueden querer que esas gemas y versiones exactas puedan ejecutarse correctamente. Si solo corres sin bundle exec, usted puede obtener algunos errores extraños.

Usar bundle exec garantiza que el programa se ejecute con el entorno especificado en el gemfile, 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 debe ejecutarse correctamente sin importar qué configuración extraña tenga en su computadora.

Básicamente estandariza el entorno bajo el cual se ejecuta el programa. Esto ayuda a evitar el infierno de la versión y hace que la vida sea mucho sencillo.

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

 106
Author: jergason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-05 12:35:38

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

¡Pero no hay ninguna gema de rake especificada en el Gemfile!
Sí, pero se instaló una gema rake como dependencia de otra gema look mira en Gemfile.bloqueo. Así que la regla debe ser: Usa la versión de rake especificada en Gemfile.bloqueo.

Pero Gemfile.lock no especifica una versión específica specifies especifica una versión mayor que x. y!
Entonces la regla debe ser: Usa la versión de rake que se instaló en el conjunto de gemas actual.

$ rake db: migrar
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 la 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

Así que si ejecutar,

$ rake db:migrate

Que puede usar una gema de rake diferente a la que instalaste con bundle install. Pero, incluso si su sistema encuentra la misma versión de rake que bundle exec, cualquier joya requerida por el código fuente de rake se buscará en lugares fuera del conjunto de gemas de su proyecto. Por lo tanto, hay muchas maneras que solo:

$ rake db:migrate

Puede arruinar las cosas.

De acuerdo con el Libro Tutorial de Ruby on Rails(gratuito en línea), sección 3.6, si está utilizando rvm 1.11.x+ entonces no necesita prefacio de comandos con bundle exec.

 5
Author: 7stud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-10 17:47:13

Ejecutando cualquier exacutable sin bundle exec, Rubygems obtendrá la última versión de la gema instalada en su sistema.

Al agregar el prefijo bundle exec en su lugar, el ejecutable se ejecutará en el contexto de su Gemfile.bloquear, lo que significa que se ejecutará utilizando la versión definida en el archivo gem.

 1
Author: pastullo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-29 15:08:14