Как Ruby узнает, где найти нужный файл?
-
03-07-2019 - |
Вопрос
Вот еще один вопрос новичка:
require 'tasks/rails'
Я видел эту строку в Rakefile в корне каждого проекта Rails.Я предполагаю, что эта строка используется для того, чтобы потребовать от поставщика/rails/railties/lib/tasks/rails.rb загрузить все 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 }
Мой вопрос: почему для метода require указывается только «tasks/rails», а не полный путь к файлу?
Заранее спасибо.
Решение
Когда вы запускаете приложение rails, оно запускает config / boot.rb, который вызывает Rails::Initializer.set_load_path
и устанавливает $LOAD_PATH
.
Ruby использует этот список каталогов для поиска файлов, указанных в строке require
. Если вы укажете абсолютный путь, например require '/home/lolindrath/ruby/lib.rb'
, поиск будет пропущен.
Это примерно аналогично #include <stdlib.h>
в C / C ++, где он ищет путь включения, который вы даете компилятору, чтобы найти этот заголовочный файл.
Другие советы
Я полагаю, потому что ваши пути настроены в вашем файле /config/environment.rb:
require File.join(File.dirname(__FILE__), 'boot')
Конечно.В /config/boot.rb (вызываемом в Environment.rb) RAILS_ROOT настроен следующим образом:
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
Я считаю, что это позволяет вам требовать что-то из корня.Надеюсь, это все-таки ответ!