Къде да поставите/осъществите достъп до конфигурационния файл в gem?

Пиша първия си скъпоценен камък и бих искал конкретни опции да бъдат извлечени и зададени от потребителя чрез файл config.yml.

Къде трябва да бъде поставен този файл в структурата на моя gem файл и как някой може да промени файла, когато инсталира моя gem? Предполагам, че те могат да предадат специфични опции при инсталирането на скъпоценния камък и тези опции могат да бъдат картографирани към файла 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

Ако вашият скъпоценен камък включва команда, която може да се изпълнява интерактивно от потребителя, най-добре би било да поискате всички необходими подробности при първото изпълнение. Добро място за запазване на конфигурацията би било в домашната директория на потребителя като dot-файл.

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

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 конфигурационен файл в моя gem? И възможно ли е потребителят да има достъп до същия този файл и да променя свойствата му? - person webren; 04.06.2011
comment
Позволяването на потребителя да предостави свой собствен YAML файл би било чудесен избор. Предполагам, че конкретно местоположение ще трябва да бъде посочено в моята документация за скъпоценни камъни и просто използвам YAML.load_file, за да заредя съдържанието на конфигурацията? - person webren; 07.06.2011