Я делаю драгоценный камень для внутреннего пользования. В нем я загружаю некоторый YAML из другого каталога:
# 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
но я не уверен, что мне нравится этот подход также.
Если есть основной файл, который вы всегда запускаете, вы можете использовать этот файл в качестве точки отсчета. Относительный путь (между текущим каталогом и) этого файла будет в $0
, поэтому, чтобы получить относительный путь к data/root.yaml
(предполагая, что это относительный путь между главным файлом и root.yaml
), вы делаете
path_to_root_yaml = File.dirname($0) + '/data/root.yaml'