2010-06-19 127 views
5

我正在製作一個內部使用的寶石。在這裏面,我從另一個目錄加載一些YAML:如何從Ruby中的特定相對路徑加載文件?

# in <project_root>/bin/magicwand 
MagicWand::Configuration::Initializer.new(...) 

# in <project_root>/lib/magicwand/configuration/initializer.rb 
root_yaml = YAML.load_file(
    File.expand_path("../../../../data/#{RootFileName}", __FILE__)) 

# in <project_root>/data/root.yaml 
--- 
apple: 100 
banana: 200 
coconut: 300 

我寧願不依賴於data/root.yaml相對的位置initializer.rb。相反,我寧願得到<project_root>的參考,並依賴於從那裏的相對路徑,這似乎是一個更聰明的舉措。

首先,這是最好的方式嗎?其次,如果是這樣,我該怎麼做?我檢查了各種File方法,但我不認爲有這樣的事情。我使用Ruby 1.9。

現在,我創建了一個特殊的常數,取決於代替:

# in lib/magicwand/magicwand.rb 
module MagicWand 
    # Project root directory. 
    ROOT = File.expand_path("../..", __FILE__) 
end 

,但我不知道我喜歡這種方法無論是。

回答

4

如果您總是運行一個主文件,您可以使用該文件作爲參考點。相對路徑的文件(當前目錄之間)將在$0,所以得到的相對路徑data/root.yaml(假設是主文件和root.yaml之間的相對路徑),這樣做

path_to_root_yaml = File.dirname($0) + '/data/root.yaml' 
+0

這是一個好主意,但它會在測試期間中斷,當我經常直接對這些類進行單元測試而不是啓動完整的應用程序堆棧。在這種情況下,我的'$ 0'會有所不同(通往測試運行者的路徑,而不是我的應用程序)。 – 2010-06-19 14:53:49

+0

將查找包裝在一個簡單的對象中,您可以在測試期間將其取出。 – Theo 2010-06-19 21:35:37