2012-01-19 70 views
10

De the gemfile man page, aprendí que hay dos formas de importar las gemas que ha especificado en el Gemfile. El bundle.setup "configuración agrega gemas a la ruta de carga de Ruby", mientras que bundle.require requerirá todas las gemas.cuál es la diferencia entre bundle.setup y bundle.require

¿Cuál es la diferencia entre estos dos métodos? ¿En qué condición debo usar uno de ellos?

+0

Ver http://anti-pattern.com/use-bundler-setup-instead-of-bundler-require y http://myronmars.to/ n/dev-blog/2012/12/5-reasons-to-avoid-bundler-require para un razonamiento sólido acerca de por qué debería usar la configuración de Bundler (en lugar de requerir) y luego manualmente requerir sus dependencias. –

Respuesta

19

Bundler.setup modifica LOAD_PATH, por lo que puede hacer cosas como require 'some_gem' y funcionarán. Te permite requerir gemas 'a mano'. Antes de Bundler, usando Rubygems, lograrías mucho del mismo efecto haciendo require 'rubygems'.

Bundler.require(:default), por el contrario, en realidad requiere todas las gemas en el Gemfile (suponiendo que no esté utilizando grupos; de lo contrario, se requieren las de los grupos especificados si proporciona argumentos). Es una abreviatura de un grupo de declaraciones require 'some_gem'.

Ver http://gembundler.com/rationale.html. Tenga en cuenta que dicen que tiene que hacer require 'bundler/setup' antes de hacer Bundler.require, pero en la práctica esto generalmente no es necesario. Casi nunca uso Bundler.setup (o require 'bundler/setup), porque necesito todas las gemas a través de Bundler.require).

+1

Si entiendo bien, 'Bundler.setup' + un montón de 'requiere' declaración es igual a' Bundler.require', ¿verdad? – steveyang

+0

Sí, eso es correcto. – Confusion

5

Debe usar Bundle.setup y puede usar Bundle.require.

El punto principal de bundler es asegurarse de que las Gemas definidas en el Gemfile sean visibles para la aplicación, es decir, todas las gemas mencionadas allí exactamente en las versiones mencionadas, pero ninguna más. Para hacer eso, la ruta de carga está adaptada. Esto se hace por Bundle.setup.

Para utilizar realmente las gemas, deben ser requeridas y, por lo tanto, cargadas en la aplicación. Esto se puede hacer a mano usando un número de declaraciones require o automáticamente para todas las gemas enumeradas en el Gemfile (o solo algunos grupos) usando Bundle.require. Sin embargo, esto solo es posible después de adaptar el loadpath como se mencionó anteriormente.

0

Bundle.setup no es necesario para la versión reciente de bundler. de hecho, cuando ejecuta Bundler.require, siempre intenta configurar correctamente $LOAD_PATH para usted.

la única necesidad es:

require 'bundler' Bundler.require

Cuestiones relacionadas