Gdzie umieścić / uzyskać dostęp do pliku konfiguracyjnego w gem?

Piszę swój pierwszy gem i chciałbym, aby określone opcje zostały pobrane i ustawione przez Użytkownika za pomocą config.plik yml.

Gdzie należy umieścić ten plik w strukturze pliku gem i jak ktoś modyfikuje plik podczas instalacji gem? Domyślam się, że mogą przekazać określone opcje podczas instalacji klejnotu, a te opcje można zmapować do config.plik yml, ale jak to możliwe?

Jest również najlepszym sposobem na odzyskanie pliku poprzez YAML.load_file?

Oglądałem Railcasty Ryana na temat tworzenia klejnotu przez Bundlera, ale on nie porusza tego tematu.

Author: the Tin Man, 2011-06-04

4 answers

Skaczę trochę za późno, ale na przyszłość zostawię przykład jak sobie z tym radzę.

Jak już wspomniano, zwykle będziesz chciał zezwolić na konfigurację zarówno za pomocą Plików, jak i skrótów. Jest to dość łatwe i lekkie, aby włączyć oba sposoby, więc powinieneś to zrobić.

Coś takiego działa u mnie w większości scenariuszy:

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

Dodatkową najlepszą praktyką byłoby posiadanie domyślnych wartości dla wszystkich kluczy konfiguracyjnych(jak w przykładzie powyżej). W ten sposób dajesz użytkownikowi pełną swobodę w konfigurowaniu biblioteki.

 49
Author: Nicholas B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-11 18:57:13

Jeśli twój gem zawiera polecenie, które może być uruchamiane interaktywnie przez użytkownika, najlepiej będzie poprosić o wszelkie niezbędne szczegóły przy pierwszym uruchomieniu. Dobrym miejscem do zapisania konfiguracji byłby katalog domowy użytkownika jako plik kropkowy.

Jeśli twój gem jest przeznaczony wyłącznie do użycia w innym kodzie jako biblioteka, to konfiguracja powinna być przekazywana jako hash lub tym podobne.

 5
Author: Iain Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-03 22:32:39

Jako klejnot musisz pozwolić ludziom na interfejs z nim, jak chcą. Nie możesz zakładać żadnej struktury aplikacji. Zamiast tego Udostępnij API, które pozwala deweloperowi przekazać hash opcji lub ścieżkę do ich własnego pliku YAML, który możesz odczytać i przeanalizować.

Ale próba ustalenia konwencji nazewnictwa plików z klejnotu prawdopodobnie nie jest tym, czego chcesz.

 2
Author: Alex Wayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-03 22:26:56

Kolejny wzorzec bez użycia plików konfiguracyjnych:

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

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

 1
Author: Artur Beljajev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-07 12:21:10