Где разместить / получить доступ к файлу конфигурации в драгоценном камне?

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

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

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

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


person webren    schedule 03.06.2011    source источник


Ответы (4)


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

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

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

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

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

person Nicholas B.    schedule 11.04.2012
comment
Я продолжаю получать undefined method 'to_sym' for {hash => 'var"}:Hash (NoMethodError, когда использую что-то подобное. Он жалуется на метод self.configure(). - person FilBot3; 12.05.2015
comment
Я изменил k.to_sym на :k.to_sym, и ошибка больше не возникает, но он даже не пытается прочитать мой файл конфигурации. - person FilBot3; 13.05.2015

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

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

person Iain Wilson    schedule 03.06.2011
comment
Моя ситуация последняя (мой код будет использоваться как библиотека). Как мне разрешить пользователям отправлять параметры через хэш? - person webren; 06.06.2011

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

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

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

person Artur Beljajev    schedule 07.11.2017

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

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

person Alex Wayne    schedule 03.06.2011
comment
Гем, созданный с помощью Bundler, имеет определенную структуру, уже установленную для вас. Я пытаюсь найти лучшее место для вставки моего файла конфигурации в эту структуру (внутри моего собственного драгоценного камня). Существует множество драгоценных камней, которые позволяют пользователям указывать параметры. Скажем, например, вы пишете гем, который взаимодействует с сервисом RESTful. Итак, нам нужен URL для подключения к сервису. Вместо жесткого кодирования URL-адреса в моем коде подключения я хотел бы поместить его в файл конфигурации и получить его в своем коде из этого файла. - person webren; 04.06.2011
comment
Кроме того, предположим, что ваш гем позволяет пользователям подключаться к любой службе RESTful, но ваш пользователь должен знать URL-адрес. Как вы берете URL-адрес пользователя и помещаете его в логику подключения службы вашего кода? (это отражает вопрос 2). - person webren; 04.06.2011
comment
Вы хотите загрузить файл yaml, упакованный в ваш гем, из вашего гем? Или вы хотите автоматически загружать файл yaml из кода, потребляющего ваш гем? - person Alex Wayne; 04.06.2011
comment
Да на предыдущий вопрос. Как я могу загрузить файл конфигурации YAML в свой драгоценный камень? И может ли пользователь иметь доступ к тому же файлу и изменять его свойства? - person webren; 04.06.2011
comment
Разрешение пользователю предоставлять свой собственный файл YAML было бы отличным выбором. Я предполагаю, что в моей документации по гему должно быть указано конкретное местоположение, и я просто использую YAML.load_file для загрузки содержимого конфигурации? - person webren; 07.06.2011