Ruby如何知道在哪里可以找到所需的文件?

时间:2009-01-06 16:20:32

标签: ruby-on-rails ruby require

这是另外一个新手问题:

require 'tasks/rails'

我在每个rails项目的根路径中看到了Rakefile中的这一行。我想这一行用于要求vendor / 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',而不是文件的完整路径?

提前致谢。

3 个答案:

答案 0 :(得分:13)

启动rails应用程序时,会运行config / boot.rb,调用Rails::Initializer.set_load_path并设置$LOAD_PATH

Ruby使用该目录列表来查找require行上指定的文件。如果你给它一个绝对路径,如require '/home/lolindrath/ruby/lib.rb',它将跳过该搜索。

这大致类似于C / C ++中的#include <stdlib.h>,它会搜索您为编译器找到该头文件的包含路径。

答案 1 :(得分:1)

我相信因为您的路径是在/config/environment.rb文件中设置的:

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

答案 2 :(得分:0)

不确定。在/config/boot.rb(在environment.rb中调用)中,RAILS_ROOT设置如下:

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

这允许你从我认为的根源要求。希望无论如何都是答案!