¿Qué significa el rake ejecutivo del paquete?
¿Que bundle exec rake db:migrate
significa? ¿O sólo bundle exec rake <command>
en general?
Entiendo que bundle
se encarga de mantener las cosas en Gemfile. Sé lo que significa la palabra "ejecutivo". Entiendo que rake
mantiene todas las diferentes cosas de scripts que puedes hacer, y sé que db:migrate
es una de ellas. Simplemente no sé qué hacen todas estas palabras juntas. ¿ Por qué debería bundle
usarse para ejecutar rake
para ejecutar una migración de base de datos?
bundle exec
es un comando de Bundler para ejecutar un script en el contexto del paquete actual (el del Gemfile de su directorio ). rake db:migrate
es el script donde db es el espacio de nombres y migrar es el nombre de la tarea definida.
Entonces 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 del paquete :
En algunos casos, ejecutar ejecutables sin
bundle exec
puede funcionar, si el ejecutable está instalado en su sistema y no incluye ninguna gema que entre en conflicto con su paquete.Sin embargo, esto no es confiable y es fuente de dolor considerable. Incluso si parece que funciona, es posible que no funcione en el futuro o en otra máquina.
Estás ejecutando bundle exec
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 utilizar. Es decir, el script se creó para ejecutarse correctamente en estas versiones de gemas.
Su Gemfile de todo el sistema puede diferir de este Gemfile. Es posible que tenga gemas más nuevas o más antiguas con las que este script no funciona bien. Esta diferencia de versiones puede provocar errores extraños.
bundle exec
le ayuda a evitar estos errores. Ejecuta el script utilizando las gemas especificadas en el Gemfile del script en lugar del Gemfile de todo el 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 usando la versión 2.8.3 de Rails y no alguna otra versión que haya instalado en todo el sistema.
Esto surge mucho cuando tu gemfile.lock tiene diferentes versiones de las gemas instaladas en tu máquina. Es posible que reciba una advertencia después de ejecutar rake (o rspec u otros), como por ejemplo:
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 bundle exec
le dice al paquete que ejecute este comando independientemente del diferencial de versión. No siempre hay un problema, sin embargo, es posible que tengas problemas.
Afortunadamente, existe una joya que soluciona esto: rubygems-bundler.
$ gem install rubygems-bundler
$ $ gem regenerate_binstubs
Luego prueba tu rastrillo, rspec o lo que sea nuevamente.
Probablemente debería mencionarse que hay formas de omitir bundle exec
(todas se indican en el capítulo 3.6.1 del libro Tutorial Ruby on Rails de Michael Hartl ).
La más sencilla es utilizar 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
Luego, el bundler_stubs
directorio también debería agregarse al .gitignore
archivo.
Una tercera opción es usar la rubygems-bundler
gema si no estás usando RVM:
$ gem install rubygems-bundler
$ gem regenerate_binstubs