ruby-on-rails - rails console
¿Qué significa bundle exec rake? (7)
¿Qué significa bundle exec rake db:migrate
? ¿O simplemente bundle exec rake <command>
en general?
Entiendo que el bundle
se encarga de mantener las cosas en el Gemfile. Sé lo que significa la palabra "exec". Entiendo que rake
mantiene todas las diferentes cosas de scripty que puedes hacer, y sé que db:migrate
es una de esas. Simplemente no sé qué están haciendo todas estas palabras juntas. ¿Por qué debería usarse el bundle
para ejecutar rake
para ejecutar una migración de base de datos?
Cuando ejecuta directamente la tarea de rake o ejecuta cualquier archivo binario de una gema, no hay garantía de que el comando se comporte como se espera. Porque puede suceder que ya tengas la misma gema instalada en tu sistema que tiene una versión de 1.0, pero en tu proyecto tienes una versión más alta de 2.0. En este caso no se puede predecir cuál se utilizará.
Para imponer la versión de gema deseada, necesita la ayuda del comando bundle exec
que ejecutaría el binario en el contexto del paquete actual. Eso significa que cuando usa bundle exec, bundler verifica la versión de gema configurada para el proyecto actual y la usa para realizar la tarea.
También escribí una publicación sobre esto que también muestra cómo podemos evitar usarla con los talones de basura.
Estás ejecutando bundle exec
en un programa. Los creadores del programa lo escribieron cuando ciertas versiones de gemas estaban disponibles. El programa Gemfile especifica las versiones de las gemas que los creadores decidieron usar. Es decir, el script fue creado para ejecutarse correctamente contra estas versiones de gemas.
Su Gemfile de todo el sistema puede diferir de este Gemfile. Es posible que tengas gemas nuevas o antiguas con las que este script no se reproduce bien. Esta diferencia en las versiones puede darte errores extraños.
Bundle exec
te ayuda a evitar estos errores. Ejecuta el script utilizando las gemas especificadas en el archivo Gem del archivo en lugar del archivo Gem del archivo del sistema. Ejecuta ciertas versiones de gemas con la magia de los alias de shell.
Ver más en la página de manual .
Aquí hay un ejemplo de Gemfile:
source ''http://rubygems.org''
gem ''rails'', ''2.8.3''
Aquí, bundle exec
ejecutaría el script utilizando la versión 2.8.3 de Rails y no alguna otra versión que pueda haber instalado en todo el sistema.
Esto aparece mucho cuando tu gemfile.lock tiene diferentes versiones de las gemas instaladas en tu máquina. Puede recibir una advertencia después de ejecutar rake (o rspec u otros) como:
You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.
Anteponer el bundle exec
le dice al bundler que ejecute este comando independientemente de la versión diferencial. No siempre hay un problema, sin embargo, puede que tenga problemas.
Afortunadamente, hay una gema que resuelve esto: rubygems-bundler.
$ gem install rubygems-bundler
$ $ gem regenerate_binstubs
Luego prueba tu rastrillo, rspec, o lo que sea otra vez.
No he usado mucho el paquete exec, pero lo estoy configurando ahora.
He tenido casos en los que se usó el rastrillo incorrecto y se perdió mucho tiempo rastreando el problema. Esto te ayuda a evitar eso.
Aquí se explica cómo configurar rvm para que pueda usar bundle exec de forma predeterminada dentro de un directorio de proyecto específico:
http://robots.thoughtbot.com/post/15346721484/use-bundlers-binstubs
Probablemente debería mencionarse, que hay maneras de omitir bundle exec
(todos se detallan en el capítulo 3.6.1 del libro de Michael Hartls Ruby on Rails Tutorial ).
Lo más simple es usar una versión suficientemente actualizada de RVM (> = 1.11.x).
Si está restringido a una versión anterior de RVM, siempre puede usar este método también mencionado por calasyr :
$ rvm get head && rvm reload
$ chmod +x $rvm_path/hooks/after_cd_bundler
$ bundle install --binstubs=./bundler_stubs
El directorio bundler_stubs
también debe agregarse al archivo .gitignore
.
Una tercera opción es usar la gema rubygems-bundler
si no estás usando RVM:
$ gem install rubygems-bundler
$ gem regenerate_binstubs
Significa usar rake que el bundler conoce y forma parte de su Gemfile sobre cualquier rake que el bundler no conoce y ejecutar la tarea db: migrate.
bundle exec
es un comando de Bundler para ejecutar un script en el contexto del paquete actual (el que se encuentra en el Gemfile de su directorio). rake db:migrate
es el script donde db es el espacio de nombres y migrate es el nombre de la tarea definido.
Así que el bundle exec rake db:migrate
ejecuta el script rake con el comando db:migrate
en el contexto del paquete actual.
En cuanto al "¿por qué?" Citaré de la página de paquete :
En algunos casos, ejecutar ejecutables sin el
bundle exec
puede funcionar, si el ejecutable está instalado en su sistema y no extrae ninguna gema que entre en conflicto con su paquete.Sin embargo, esto no es confiable y es la fuente de un dolor considerable. Incluso si parece que funciona, puede que no funcione en el futuro o en otra máquina.