2009-01-06 59 views
5

这里是一个更新手问题:Ruby如何知道在哪里可以找到所需的文件?

require 'tasks/rails' 

我看到了这条线的Rakefile在每个轨道项目的根路径。我想用这条线,要求供应商/导轨/ railties/lib中/任务/ rails.rb得到所有耙任务加载:

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

我的问题是,为什么只有“任务/轨”是需要指定方法,但不是文件的完整路径?

在此先感谢。

回答

13

当您启动Rails应用程序运行的config /的boot.rb这就要求Rails::Initializer.set_load_path和thatsets了$LOAD_PATH

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

这与C/C++中的#include <stdlib.h>大致相似,它将搜索包含编译器查找头文件的包含路径。

1

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

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

我不明白,你能更具体吗? – eric2323223 2009-01-06 16:49:16

+0

这会得到当前正在运行的脚本的文件名,它使用File.dirname获取文件所在的目录,然后向其中添加一个新文件(即,要求知道文件位于同一目录中,但不在$ LOAD_PATH中)。然后File.join安全地生成新的文件名。 – Lolindrath 2009-01-06 17:16:03

0

当然。在/config/boot.rb(在environment.rb中称呼)的RAILS_ROOT被设置为这样:

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

,让您需要从根本上相信的东西。无论如何希望这就是答案!

相关问题