Que bundle exec rake db:migrate
significa ¿O solo bundle exec rake <command>
en general?
Entiendo que bundle
se encarga de mantener las cosas en el Gemfile. Sé lo que significa la palabra "ejecutivo". Entiendo que rake
mantiene todas las cosas diferentes que puedes hacer, y sé que db:migrate
es una de esas. 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?
fuente
bundle
es el comando que utiliza Bundler..ruby-gemset
archivo en la raíz de su proyecto. También hay un.ruby-version
archivo que establece su versión de ruby si usa RVM.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 usar. Es decir, el script fue hecho para ejecutarse correctamente contra 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 en las versiones puede darte errores extraños.
bundle exec
Le ayuda a evitar estos errores. Ejecuta el script usando 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 concha.Ver más en la página del manual .
Aquí hay un ejemplo de Gemfile:
Aquí,
bundle exec
ejecutaría el script usando rails versión 2.8.3 y no alguna otra versión que pueda haber instalado en todo el sistema.fuente
rake db:migrate
corriendobundle exec
, ¿se ejecutaría usando un Gemfile en todo el sistema donde uno puede tener un rack en 1.5.2 (más reciente)?bundle exec
utiliza las gemas locales "específicas de la aplicación" en su Gemfile de su aplicación, ybundle
utiliza las gemas globales "específicas de la máquina" si lo hizogem install a_certain_gem
. local vs globalEsto surge mucho cuando su gemfile.lock tiene diferentes versiones de las gemas instaladas en su 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.
El antecedente
bundle exec
le dice al agrupador que ejecute este comando independientemente de la versión diferencial. No siempre hay un problema, sin embargo, puede tener 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 de nuevo
fuente
Probablemente debería mencionarse que hay formas de omitir
bundle exec
(todas se mencionan en el capítulo 3.6.1 del libro Tutorial Ruby on Rails de Michael Hartls ).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 :
El
bundler_stubs
directorio también debe agregarse al.gitignore
archivo.Una tercera opción es usar la
rubygems-bundler
gema si no estás usando RVM:fuente
Cuando ejecuta directamente la tarea de rastrillo o ejecuta cualquier archivo binario de una gema, no hay garantía de que el comando se comporte como se esperaba. Porque puede suceder que ya tenga la misma gema instalada en su sistema que tiene una versión que dice 1.0 pero en su proyecto tiene una versión más alta que dice 2.0. En este caso, no puede predecir cuál se utilizará.
Para imponer la versión de gema deseada, toma la ayuda del
bundle exec
comando que ejecutaría el binario en el contexto del paquete actual. Eso significa que cuando usa bundle exec, bundler comprueba la versión de gema configurada para el proyecto actual y la usa para realizar la tarea.También escribí una publicación al respecto que también muestra cómo podemos evitar usarlo usando los apéndices bin.
fuente
No he usado
bundle exec
mucho, pero lo estoy configurando ahora.He tenido casos en los que se utilizó el rastrillo incorrecto y se perdió mucho tiempo rastreando el problema. Esto te ayuda a evitar eso.
A continuación, le mostramos cómo configurar RVM para que pueda usar
bundle exec
de manera predeterminada dentro de un directorio de proyecto específico:https://thoughtbot.com/blog/use-bundlers-binstubs
fuente
Significa usar el rastrillo que el agrupador conoce y forma parte de su Gemfile sobre cualquier rastrillo que el agrupador no conozca y ejecute la tarea db: migrate.
fuente