Где разместить / получить доступ к файлу конфигурации в гем? - PullRequest
36 голосов
/ 04 июня 2011

Я пишу свой первый драгоценный камень, и я хотел бы, чтобы определенные параметры были извлечены и установлены пользователем через файл config.yml.

Где этот файл должен находиться в структуре моего файла gem и как кто-то изменяет файл при установке моего gem? Я предполагаю, что они могут передавать определенные параметры при установке гема, и эти параметры могут быть сопоставлены с файлом config.yml, но как это возможно?

Кроме того, это лучший способ получить файл через YAML.load_file?

Я смотрел репортажи Райана о создании драгоценного камня с помощью Bundler, но он не охватывает эту тему.

Ответы [ 4 ]

50 голосов
/ 11 апреля 2012

Я немного опоздал на этот вопрос, но оставлю пример реализации того, как я обычно это делаю, для дальнейшего использования.

Как уже упоминалось, вы обычно хотите разрешить настройку как с помощью файлов, так и с помощью хэшей. Довольно легко и легко включить оба способа, поэтому вам следует это сделать.

Что-то подобное работает для меня в большинстве сценариев:

require 'yaml'

module MyGem
  # Configuration defaults
  @config = {
              :log_level => "verbose",
              :min => 0,
              :max => 99 
            }

  @valid_config_keys = @config.keys

  # Configure through hash
  def self.configure(opts = {})
    opts.each {|k,v| @config[k.to_sym] = v if @valid_config_keys.include? k.to_sym}
  end

  # Configure through yaml file
  def self.configure_with(path_to_yaml_file)
    begin
      config = YAML::load(IO.read(path_to_yaml_file))
    rescue Errno::ENOENT
      log(:warning, "YAML configuration file couldn't be found. Using defaults."); return
    rescue Psych::SyntaxError
      log(:warning, "YAML configuration file contains invalid syntax. Using defaults."); return
    end

    configure(config)
  end

  def self.config
    @config
  end
end

Дополнительная рекомендация - использовать значения по умолчанию для всех ваших ключей конфигурации (как в примере выше). Таким образом, вы предоставляете пользователю максимальную свободу в настройке вашей библиотеки.

5 голосов
/ 04 июня 2011

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

Если ваш гем предназначен исключительно для использования в другом коде в качестве библиотеки, то разрешается передавать конфигурацию как хеш или тому подобное.

2 голосов
/ 04 июня 2011

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

Но попытка установить соглашение об именовании файлов из гема, вероятно, нет то, что вы хотите.

1 голос
/ 07 ноября 2017

Другой шаблон без использования файлов конфигурации:

YourGem.configure do |config|
  config.api_key = 'your_key_here'
end

https://robots.thoughtbot.com/mygem-configure-block

...