ruby bundler

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 de foo.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 .