¿Cómo sabe Ruby dónde encontrar un archivo requerido?
-
03-07-2019 - |
Pregunta
Aquí hay una pregunta más para novatos:
require 'tasks/rails'
Vi esta línea en Rakefile en la ruta raíz de cada proyecto de rails. Supongo que esta línea se usa para requerir vendor / rails / railties / lib / task / rails.rb para cargar todas las tareas de rake:
$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é solo se especifica 'tareas / rieles' para el método require, pero no la ruta completa del archivo?
Gracias de antemano.
Solución
Cuando inicia su aplicación rails, ejecuta config / boot.rb que llama a Rails::Initializer.set_load_path
y eso configura el $LOAD_PATH
.
Ruby usa esa lista de directorios para encontrar los archivos especificados en una línea require
. Si le das 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 de inclusión que le da al compilador para encontrar ese archivo de encabezado.
Otros consejos
Creo que porque sus rutas están configuradas en su archivo /config/environment.rb:
require File.join(File.dirname(__FILE__), 'boot')
Claro. En /config/boot.rb (llamado en environment.rb) RAILS_ROOT se configura así:
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
Lo que te permite requerir cosas desde la raíz, creo. ¡Espero que esa sea la respuesta de todos modos!