2012-05-03 11 views
5

Esta pregunta es sobre bundler, rubygems & cómo se da cuenta de qué método estoy llamando. Es bastante largo, así que por favor tengan paciencia conmigo.¿Cómo funciona el paquete?

Según mi entender, Bundler es una herramienta de gestión de la dependencia para la gestión de gemas de rubí. Instala todas las gemas & sus dependencias enumeradas en el Gemfile.

La pregunta que deseo formular se puede ilustrar mejor con un ejemplo. así que aquí -> En mi rieles aplicación que estoy haciendo esto en mi controlador: -

module SurveyorControllerCustomMethods 
    def create 
    super 
    end 
end 
class SurveyorController < ApplicationController 
    include Surveyor::SurveyorControllerMethods 
end 

Aquí, estoy haciendo dos cosas:

  1. Incluir SurveyorControllerMethods de la gema del topógrafo.
  2. Como ya he utilizado súper aquí, sería llamar create método de SurveyorControllerMethods que funciona muy bien, pero yo no entenderlo.

y la gema está instalada en

$ bundle show surveyor 
/home/gaurish/.rvm/gems/ruby-1.9.3-p194/gems/surveyor-0.22.0 

que, sorprendentemente, no está presente en el rubí de $LOAD_PATH. entonces la pregunta es:

  1. ¿cómo funciona?
  2. Instalar una gema utilizando un paquete, ¿qué ocurre entre bastidores durante la instalación?
  3. hay algunas gemas ex jquery-rails para las que incluso no tenemos que incluirlas/llamarlas en nuestro código &, el archivo jQuery JavaScript se incluye automáticamente. Sé que no es magia, ¿cómo funciona esto?

Respuesta

2

En realidad, la clave está en cómo se configura Rails fuera de la caja. Lo cual es también una de las razones por las que Rails es tan lento para comenzar proyectos más grandes. [1]

En boot.rb Usted encontrará:

require 'bunder/setup' 

y en la parte superior de application.rb Usted encontrará:

Bundler.require(:default, :development) 

Esta última llamada al método se ve de nuevo a su Gemfile, luego itera todo de las gemas que están en los grupos dados (:default y :development en el punto anterior). A continuación, se necesita una determinación para determinar cuál es el archivo predeterminado que se debe cargar, que suele ser el nombre de la gema, pero también se puede especificar mediante una opción :require. Bundler también tiene algunas excepciones de convención de nomenclatura incorporadas, como el manejo de "-" en lugar de "_".

Bundler carga el archivo primario de la gema, que a su vez (normalmente) carga los archivos dentro de la gema.

El archivo 'bundler/setup' realiza Bundler.setup, que se ocupa de la ruta de la carga. Precede (desvía) al $LOAD_PATH por cada gema.La información real sobre cuáles deberían ser las rutas de cargas proviene de rubygems.

Echa un vistazo a la fuente en:

https://github.com/carlhuda/bundler/blob/master/lib/bundler/setup.rb https://github.com/carlhuda/bundler/blob/master/lib/bundler/runtime.rb

[1]: Cuando Si inicia un nuevo proyecto de Rails, probablemente descubra que no se vuelve tan lento con el tiempo si elimina la línea Bundler.require y solo necesita gemas a medida que se necesitan.

+0

No encuentro 'Bundler.setup (: predeterminado,: desarrollo)' en 'config/boot.rb' o' config/application.rb'? – CuriousMind

+0

Vaya, me disculpo, requiere 'bundler/setup', que lo está haciendo indirectamente https://github.com/carlhuda/bundler/blob/master/lib/bundler/setup.rb – d11wtq