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.
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.
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.
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.
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
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