2009-01-06 15 views
5

Aquí es una pregunta más novato:¿Cómo sabe Ruby dónde encontrar un archivo requerido?

require 'tasks/rails' 

vi esta línea en Rakefile en la ruta raíz de cada proyecto de rieles. Creo que esta línea se utiliza para requerir vendedor/rieles/railties/lib/tareas/rails.rb para obtener todas las tareas rastrillo cargados:

$VERBOSE = nil 
# Load Rails rakefile extensions 
Dir["#{File.dirname(__FILE__)}/*.rake"].each { |ext| load ext } 
# Load any custom rakefile extensions 
Dir["#{RAILS_ROOT}/lib/tasks/**/*.rake"].sort.each { |ext| load ext } 
Dir["#{RAILS_ROOT}/vendor/plugins/*/**/tasks/**/*.rake"].sort.each { |ext| load ext } 

Mi pregunta es por qué sólo se especifica '' tareas/rieles para el requerir método, pero no la ruta completa del archivo?

Gracias de antemano.

Respuesta

13

Al iniciar sus rieles APP se ejecuta config/boot.rb que exige Rails::Initializer.set_load_path y thatsets el $LOAD_PATH .

Ruby usa esa lista de directorios para encontrar los archivos especificados en una línea require. Si le da una ruta absoluta como require '/home/lolindrath/ruby/lib.rb' se saltará esa búsqueda.

Esto es más o menos análogo a #include <stdlib.h> en C/C++ donde busca la ruta include que le da al compilador para encontrar ese archivo de encabezado.

+0

[Enlace de trabajo] (https://github.com/rails/rails/blob/2-3-stable/railties/lib/initializer.rb#L240) a 'set_load_path' de Rails 2.3. (El número de línea puede cambiar, pero probablemente el archivo no.) (No sé dónde Rails 3 pone ese mismo código). –

1

Creo porque sus caminos se configuran en el archivo de /config/environment.rb:

require File.join(File.dirname(__FILE__), 'boot') 
+0

No entiendo, ¿podría ser más específico? – eric2323223

+0

Esto obtiene el nombre de archivo de la secuencia de comandos actualmente en ejecución, obtiene el directorio donde reside el archivo usando File.dirname y luego le agrega un nuevo archivo (es decir, requiere un archivo que usted sabe que está en el mismo directorio pero no en $ LOAD_PATH) Entonces File.join realiza de forma segura el nuevo nombre de archivo. – Lolindrath

0

Sure. En /config/boot.rb (llamado en environment.rb) la RAILS_ROOT está configurado como tal:

RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT) 

que le permite requiere cosas desde la raíz creo. Espero que esa sea la respuesta de todos modos!

Cuestiones relacionadas