Config.Provider поведение
Определяет API провайдера, загружающего конфигурацию во время запуска.
Провайдеры конфигурации обычно используются во время релизов для загрузки внешней конфигурации во время запуска системы. Это делается путём запуска виртуальной машины с минимальным количеством запущенных приложений, затем вызова всех провайдеров и перезапуска системы. Это требует изменяемого файла конфигурации на диске, так как результаты работы провайдеров записываются в файловую систему. Для получения дополнительной информации о конфигурации во время выполнения см. mix release.
Пример провайдера конфигурации
Например, предположим, что вам нужно загрузить некоторую конфигурацию из файла JSON и загрузить её в систему. Данный провайдер конфигурации будет выглядеть следующим образом:
defmodule JSONConfigProvider do
@behaviour Config.Provider
# Let's pass the path to the JSON file as config
def init(path) when is_binary(path), do: path
def load(config, path) do
# We need to start any app we may depend on.
{:ok, _} = Application.ensure_all_started(:jason)
json = path |> File.read!() |> Jason.decode!()
Config.Reader.merge(
config,
my_app: [
some_value: json["my_app_some_value"],
another_value: json["my_app_another_value"],
]
)
end
end Затем, при указании релиза, вы можете указать провайдера:
config_providers: [{JSONConfigProvider, "/etc/config.json"}] Теперь, после запуска системы, она вызовет провайдера на ранней стадии процесса запуска, сохранит объединённую конфигурацию на диск и перезапустит систему с новыми значениями.
Резюме
Типы
- config_path()
Путь к файлу конфигурации.
Функции
- resolve_config_path!(path)
Преобразует
config_path/0в фактический путь.- validate_config_path!(path)
Проверяет корректность
config_path/0.
Обратные вызовы
- init(term)
Вызывается при инициализации провайдера конфигурации.
- load(config, state)
Загружает конфигурацию (обычно во время запуска системы).
Типы
config()
Спецификации
config() :: keyword()
config_path()
Спецификации
config_path() :: {:system, binary(), binary()} | binary() Путь к файлу конфигурации.
Поскольку к файлам конфигурации часто обращаются на целевых машинах, их можно выразить как:
-
двоичное представление абсолютного пути
-
кортеж {:system, system_var, path}, где конфигурация представляет собой конкатенацию
system_varс указаннымpath
state()
Спецификации
state() :: term()
Функции
resolve_config_path!(path)
Спецификации
resolve_config_path!(config_path()) :: binary()
Преобразует config_path/0 в фактический путь.
validate_config_path!(path)
Спецификации
validate_config_path!(config_path()) :: :ok
Проверяет корректность config_path/0.
Обратные вызовы
init(term)
Спецификации
init(term()) :: state()
Вызывается при инициализации провайдера конфигурации.
Провайдер конфигурации обычно инициализируется на машине, где система собирается, а не на целевой машине. Обратный вызов init/1 полезен для проверки переданных аргументов провайдеру и подготовки состояния, которое будет передано в load/2.
Кроме того, поскольку состояние, возвращаемое init/1, может быть записано в текстовые файлы конфигурации, оно должно быть ограничено только простыми типами данных, такими как целые числа, строки, атомы, кортежи, карты и списки. Такие элементы, как PID, ссылки и функции, не могут быть сериализованы.
load(config, state)
Спецификации
load(config(), state()) :: config()
Загружает конфигурацию (обычно во время запуска системы).
Он получает текущую config и state , возвращённую init/1. Затем вы обычно читаете дополнительную конфигурацию из внешнего источника и объединяете её с полученной config. Объединение должно выполняться с помощью Config.Reader.merge/2, так как оно выполняет глубокое объединение. Оно должно вернуть обновлённую конфигурацию.
Обратите внимание, что load/2 обычно вызывается очень рано в процессе загрузки, поэтому если вам нужно использовать приложение в провайдере, вы несёте ответственность за его запуск.
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.9.4/Config.Provider.html