How does Ruby know where to find a required file?

▼魔方 西西 提交于 2020-01-01 11:33:28

问题


Here is one more newbie question:

require 'tasks/rails'

I saw this line in Rakefile in the root path of every rails project. I guess this line is used to require vendor/rails/railties/lib/tasks/rails.rb to get all rake tasks loaded:

$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 }

My question is why only 'tasks/rails' is specified for the require method, but not the full path of the file?

Thanks in advance.


回答1:


When you start your rails app it runs config/boot.rb which calls Rails::Initializer.set_load_path and thatsets up the $LOAD_PATH.

Ruby uses that list of directories to find the files specified on a require line. If you give it an absolute path like require '/home/lolindrath/ruby/lib.rb' it will skip that search.

This is roughly analogous to #include <stdlib.h> in C/C++ where it searches the include path you give the compiler to find that header file.




回答2:


I believe because your paths are set up in your /config/environment.rb file:

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



回答3:


Sure. In /config/boot.rb (called in environment.rb) the RAILS_ROOT is set up as so:

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

Which allows you to require things from the root I believe. Hope that's the answer anyway!



来源:https://stackoverflow.com/questions/417179/how-does-ruby-know-where-to-find-a-required-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!