2010-06-19 2 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' будет отличаться в таких случаях (путь к тестовому бегуну, а не к моему приложению). –

+0

Оберните поиск простым объектом, который вы можете заглушить во время тестирования. – Theo

Смежные вопросы