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 foo
tiene 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 exec
garantiza 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.
bundle exec
es que también le dirá si debe ejecutarbundle install
para instalar versiones de gemas que le faltan en comparación con el archivo Gemfile.lock.$ 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 quebundle 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
.fuente
ejecutar cualquier exacutable sin
bundle exec
hará que Rubygems obtenga la última versión de la gema instalada en su sistema.Al agregar el
bundle exec
prefijo, 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.fuente