Como é que o Ruby saber onde encontrar um arquivo necessário?
-
03-07-2019 - |
Pergunta
Aqui está uma pergunta mais novato:
require 'tasks/rails'
Eu vi essa linha em Rakefile no caminho raiz de cada projeto trilhos. Eu acho que essa linha é usada para exigir vendor / rails / railties / lib / tarefas / rails.rb para obter todas as tarefas rake carregada:
$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 }
A minha pergunta é por isso que é especificado apenas 'tarefas / rails' para o método exige, mas não o caminho completo do arquivo?
Agradecemos antecipadamente.
Solução
Quando começa os seus rails app corre configuração boot.rb que chamadas Rails::Initializer.set_load_path
e thatsets o $LOAD_PATH
.
Ruby usa essa lista de diretórios para encontrar os arquivos especificados em uma linha require
. Se você dar-lhe um caminho absoluto como require '/home/lolindrath/ruby/lib.rb'
ele vai pular essa pesquisa.
Este é aproximadamente análogo ao #include <stdlib.h>
em C / C ++, onde ele procura o caminho incluem você dá o compilador para encontrar esse arquivo de cabeçalho.
Outras dicas
Eu acredito porque seus caminhos são criados em seu arquivo /config/environment.rb:
require File.join(File.dirname(__FILE__), 'boot')
Claro. Em /config/boot.rb (chamado em environment.rb) a RAILS_ROOT é configurada assim:
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
que lhe permite exigir coisas da raiz eu acredito. Esperança essa é a resposta de qualquer maneira!