Источник 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, может быть записано в текстовые файлы конфигурации, оно должно быть ограничено только простыми типами данных, такими как целые числа, строки, атомы, кортежи, карты и списки. Элементы, такие как идентификаторы процессов, ссылки и функции, сериализовать нельзя.
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-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.16.3/Config.Provider.html