2009-01-06 57 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) 

,讓您需要從根本上相信的東西。無論如何希望這就是答案!

相關問題