Config.Provider поведение
Определяет API поставщика, который загружает конфигурацию во время запуска.
Поставщики конфигурации обычно используются во время релизов для загрузки внешней конфигурации во время запуска системы. Это делается путем запуска виртуальной машины с минимальным количеством запущенных приложений, затем вызова всех поставщиков и перезапуска системы. Это требует изменяемого конфигурационного файла на диске, так как результаты работы поставщиков записываются в файловую систему. Более подробную информацию о конфигурации во время выполнения см. в mix release.
Несколько конфигурационных файлов
Одно из распространенных применений поставщиков конфигурации — указание нескольких конфигурационных файлов в релизе. Elixir поставляется с одним поставщиком, называемым Config.Reader, который способен обрабатывать встроенные в Elixir конфигурационные файлы.
Например, предположим, что вы хотите перечислить некоторую базовую конфигурацию в встроенном файле config/runtime.exs Mix, но также хотите поддерживать дополнительные конфигурационные файлы. Для этого вы можете добавить это в часть def project вашего mix.exs.
releases: [
demo: [
config_providers: [
{Config.Reader, {:system, "RELEASE_ROOT", "/extra_config.exs"}}
]
]
]
Вы можете разместить этот extra_config.exs файл в вашем релизе несколькими способами:
Если он доступен на хосте при сборке релиза, вы можете поместить его в «rel/overlays/extra_config.exs», и он будет автоматически скопирован в корень релиза.
Если он доступен на целевом компьютере во время развертывания, вы можете просто скопировать его в корень релиза как часть шага развертывания.
Теперь, после запуска системы, она загрузит как config/runtime.exs, так и extra_config.exs на ранней стадии процесса запуска. Вы можете узнать больше о вариантах на Config.Reader.
Настраиваемый поставщик конфигурации
Вы также можете реализовать настраиваемых поставщиков конфигурации, аналогично тому, как работает Config.Reader. Например, предположим, что вам нужно загрузить некоторую конфигурацию из файла JSON и загрузить ее в систему. Данный поставщик конфигурации будет выглядеть следующим образом:
defmodule JSONConfigProvider do
@behaviour Config.Provider
# Let's pass the path to the JSON file as config
@impl true
def init(path) when is_binary(path), do: path
@impl true
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
Затем, при указании релиза, вы можете указать поставщика в конфигурации релиза:
releases: [
demo: [
config_providers: [
{JSONConfigProvider, "/etc/config.json"}
]
]
] Краткое описание
Типы
- config_path()
Путь к файлу конфигурации.
Обработчики
- init(term)
Вызывается при инициализации поставщика конфигурации.
- load(config, state)
Загрузка конфигурации (обычно во время запуска системы).
Функции
- resolve_config_path!(path)
Преобразует
config_path/0в фактический путь.- validate_config_path!(path)
Проверяет
config_path/0.
Типы
config()Источник
@type config() :: keyword()
config_path()Источник
@type config_path() :: {:system, binary(), binary()} | binary() Путь к файлу конфигурации.
Поскольку к конфигурационным файлам часто обращаются на целевых машинах, он может быть представлен как:
двоичная строка, представляющая абсолютный путь
кортеж
{:system, system_var, path}, где конфигурация представляет собой конкатенацию переменной средыsystem_varи заданногоpath
state()Источник
@type state() :: term()
Обработчики
init(term)Источник
@callback init(term()) :: state()
Вызывается при инициализации поставщика конфигурации.
Поставщик конфигурации обычно инициализируется на машине, где собирается система, а не на целевой машине. Обработчик init/1 полезен для проверки переданных аргументов поставщику и подготовки состояния, которое будет передано load/2.
Кроме того, поскольку состояние, возвращаемое init/1, может быть записано в текстовые файлы конфигурации, оно должно быть ограничено только простыми типами данных, такими как целые числа, строки, атомы, кортежи, карты и списки. Такие элементы, как PID, ссылки и функции, сериализовать нельзя.
load(config, state)Источник
@callback load(config(), state()) :: config()
Загрузка конфигурации (обычно во время запуска системы).
Получает текущую config и state возвращаемое init/1. Затем вы обычно читаете дополнительную конфигурацию из внешнего источника и объединяете её с полученной config. Объединение следует выполнять с помощью Config.Reader.merge/2, так как оно выполняет глубокое объединение. Следует вернуть обновлённую конфигурацию.
Обратите внимание, что load/2 обычно вызывается очень рано в процессе запуска, поэтому если вам нужно использовать приложение в поставщике, вы несете ответственность за его запуск.
Функции
resolve_config_path!(path)Источник
@spec resolve_config_path!(config_path()) :: binary()
Преобразует config_path/0 в фактический путь.
validate_config_path!(path)Источник
@spec validate_config_path!(config_path()) :: :ok
Проверяет config_path/0.
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.14.1/Config.Provider.html