2012-01-16 38 views
35

在HOME/path_test/I有:紅寶石加載配置(YAML)文件作爲源

load_test.rb:

require 'yaml' 
cnf = YAML::load(File.open('config.yml')) 
puts cnf['Hello'] 

config.yml:

Hello: world!!! 

時在HOME/path_test /我得到如期:

-bash-3.2$ ruby load_test.rb 
world!!! 

HOME /時(CD ..)我得到

-bash-3.2$ ruby path_test/load_test.rb 
path_test/load_test.rb:3:in `initialize': No such file or directory - config.yml  (Errno::ENOENT) 
    from path_test/load_test.rb:3:in `open' 
    from path_test/load_test.rb:3:in `<main>' 

哪個是正確的行爲,但不是我所希望的:)

有沒有辦法來.yml相對於文件加載源文件,而不是相對於當前的工作目錄?

解決方案(load_Test.rb):

cnf = YAML::load_file(File.join(File.dirname(File.expand_path(__FILE__)), 'config.yml')) 

編輯:

由於紅寶石2.0可以簡化

require 'yaml' 
fn = File.dirname(File.expand_path(__FILE__)) + '/config.yml' 
cnf = YAML::load(File.open(fn)) 
puts cnf['Hello'] 

回答

74

你應該得到當前文件的路徑並使用:

cnf = YAML::load_file(File.join(__dir__, 'config.yml')) 
+0

謝謝('')'結尾太多:)]正是我所需要的 – FelixHJ 2012-01-16 10:19:08

+3

這是完整的解決方案(爲了清晰起見,分成兩行): 'require'yaml' fn = File.dirname(File .expand_path(__ FILE__))+'/config.yml' cnf = YAML :: load(File.open(fn)) puts cnf ['Hello']' – FelixHJ 2012-01-16 10:22:39

+0

嗯,我不能得到格式化工作.... – FelixHJ 2012-01-16 10:24:03