ruby - ¿Son exec bundle y requieren ''bundler/setup'' equivalente?
(1)
¿Estas cosas logran exactamente lo mismo?
- iniciar un proceso de ruby con el
bundle exec ruby foo.rb
- habiendo
require "bundler/setup"
como la primera línea defoo.rb
En su ejemplo específico, se pueden considerar iguales, pero en realidad no son lo mismo.
bundle exec
realiza algunos cambios en el entorno que bundler/setup
no realiza. Si su foo.rb
nunca ejecuta una subshell, o nunca intenta ejecutar otros ejecutables ruby en subshells, entonces ambas versiones son equivalentes (ambas cargarán las gemas agrupadas correctamente y funcionarán exactamente igual).
La idea general de bundle exec
es permitirle ejecutar ejecutables que no fueron diseñados originalmente teniendo en cuenta el bundler . Al igual que rspec
, rails
, rackup
. Si su propia aplicación ( foo.rb
) no intenta ejecutar tales ejecutables que puedan depender de sus paquetes, entonces no hay diferencia de ninguna manera. Ya que todo lo que quiere asegurarse con Bundler es que cargue las gemas correctas, y para ese bundler/setup
funciona exactamente como se espera en su caso.
De los documentos de Bundler cuando se habla de ejecutar ejecutables del sistema ruby:
En algunos casos, ejecutar ejecutables sin el paquete 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.
Luego, desde la página del manual de bundle exec , puede obtener algunas pistas adicionales sobre lo que realmente hace bundle exec
:
MODIFICACIONES AMBIENTALES
- asegúrese de que todavía es posible desembolsar el paquete desde dentro de un comando invocado por el paquete exec (usando $ BUNDLE_BIN_PATH)
- ponga el directorio que contiene los ejecutables (como rails, rspec, rackup) para su paquete en $ PATH
- asegúrese de que si se invoca bundler en la subshell, usa el mismo Gemfile (configurando BUNDLE_GEMFILE)
- agregue -rbundler / setup a $ RUBYOPT, lo que garantiza que los programas de Ruby que se invocan en la subshell puedan ver las gemas en el paquete
Por lo tanto, si crea su aplicación teniendo en cuenta la compatibilidad con Bundler, nunca tendrá que bundle exec
su aplicación.
Pero si necesita usar otras herramientas que carguen el código de su aplicación que podrían cargar gemas antes de que carguen su código de la aplicación (que luego podría generar una gema no empaquetada incorrecta), entonces debe usar el bundle exec
.