Использование файлов yaml в гемах - PullRequest
7 голосов
/ 20 декабря 2011

Я просто работаю над своим первым гемом (также довольно новым для ruby), весь код пока здесь;

https://github.com/mikeyhogarth/tablecloth

Одна вещь, которую я пыталсяdo создает файл yaml, к которому гем может обращаться как к поиску (в lib / tablecloth / yaml / qty.yaml).Все это прекрасно работает, и модульные тесты все проходят, однако, когда я собираю и устанавливаю гем и пытаюсь запустить его под irb (из моей домашней папки), я получаю;

Errno::ENOENT: No such file or directory - lib/tablecloth/yaml/qty.yaml

Код теперь ищетфайл в ~ / lib / tablecloth ..., а не в каталоге, в который установлен гем.Итак, мои вопросы:

1) Как мне изменить строку 27 в recipe.rb так, чтобы она смотрела в папку, в которую установлен гем?

2) Я на самом деленеправильно подходит ко всему этому (уместно ли использовать статические файлы yaml в гемах таким образом)?

1 Ответ

14 голосов
/ 20 декабря 2011

Ну, прежде всего вы должны обратиться к файлу следующим образом:

file_path = File.join(File.dirname(__FILE__),"yaml/qty.yaml")
units_hash = YAML.load_file(filepath)

File.dirname(__FILE__) дает вам каталог, в котором находится текущий файл (recipe.rb).File.join правильно соединяет пути к файлам.Таким образом, вы должны использовать это для ссылки yaml-файла относительно на папку recipe.rb.

Если использование YAML-файла в этом случае является хорошей идеей, это то, что широкообсуждается.Я сам думаю, что это адекватный способ, особенно в начале разработки с ruby.

Допустимой альтернативой yaml-файлам будет rb-File (Ruby Code), в котором вы объявляете константы, которыесодержать ваши данные.Позже вы можете использовать их напрямую.Таким образом, только ruby-интерпретатор должен работать, и вы экономите время на вычислениях для других вещей.(анализатор не требуется)

Однако в обычном сценарии вы также должны позаботиться о том, чтобы чтение в файле YAML могло завершиться неудачно.Таким образом, вы должны быть в состоянии справиться с этим:

file_path = File.join(File.dirname(__FILE__),"yaml/qty.yaml")
begin
  units_hash = YAML.load_file(filepath)
rescue Psych::SyntaxError
  $stderr.puts "Invalid yaml-file found, at #{file_path}"
  exit 1
rescue Errno::EACCES
  $stderr.puts "Couldn't access file due to permissions at #{file_path}"
  exit 1
rescue Errno::ENOENT
  $stderr.puts "Couldn't access non-existent file #{file_path}"
  exit 1
end

Или, если вам не нужны подробности:

file_path = File.join(File.dirname(__FILE__),"yaml/qty.yaml")
units_hash =     
  begin
    YAML.load_file(filepath)
  rescue Psych::SyntaxError, Errno::EACCES, Errno::ENOENT
    {}
  end
...