¿Qué significa el rake ejecutivo del paquete?

Resuelto JnBrymn asked hace 13 años • 7 respuestas

¿Que bundle exec rake db:migratesignifica? ¿O sólo bundle exec rake <command>en general?

Entiendo que bundlese encarga de mantener las cosas en Gemfile. Sé lo que significa la palabra "ejecutivo". Entiendo que rakemantiene todas las diferentes cosas de scripts que puedes hacer, y sé que db:migratees una de ellas. Simplemente no sé qué hacen todas estas palabras juntas. ¿ Por qué debería bundleusarse para ejecutar rakepara ejecutar una migración de base de datos?

JnBrymn avatar Jul 06 '11 03:07 JnBrymn
Aceptado

bundle execes un comando de Bundler para ejecutar un script en el contexto del paquete actual (el del Gemfile de su directorio ). rake db:migratees el script donde db es el espacio de nombres y migrar es el nombre de la tarea definida.

Entonces bundle exec rake db:migrateejecuta el script rake con el comando db:migrateen el contexto del paquete actual.

En cuanto al "¿por qué?" Citaré de la página del paquete :

En algunos casos, ejecutar ejecutables sin bundle execpuede 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.

ghoppe avatar Jul 05 '2011 20:07 ghoppe

Estás ejecutando bundle execun 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 execle 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 execejecutarí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.

Rose Perrone avatar Apr 25 '2013 15:04 Rose Perrone

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 execle 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.

Benjamin Dunphy avatar May 15 '2014 02:05 Benjamin Dunphy

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_stubsdirectorio también debería agregarse al .gitignorearchivo.

Una tercera opción es usar la rubygems-bundlergema si no estás usando RVM:

$ gem install rubygems-bundler
$ gem regenerate_binstubs
tschale avatar May 14 '2014 13:05 tschale