rails ruby-on-rails rake bundler

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.