Source Config.Provider поведение
Определяет API поставщика, загружающего конфигурацию во время запуска.
Поставщики конфигурации обычно используются во время релизов для загрузки внешней конфигурации во время запуска системы. Это делается путем запуска VM с минимальным количеством работающих приложений, затем вызовом всех поставщиков и перезапуском системы. Это требует изменяемого конфигурационного файла на диске, так как результаты работы поставщиков записываются в файловую систему. Более подробную информацию о конфигурации во время выполнения см. на странице 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(термин)
Вызывается при инициализации поставщика конфигурации.
- load(config, state)
Загрузка конфигурации (обычно во время запуска системы).
Функции
- resolve_config_path!(путь)
Преобразует
config_path/0в фактический путь.- validate_config_path!(путь)
Проверка
config_path/0.
Типы
config()Source
@type config() :: keyword()
config_path()Source
@type config_path() :: {:system, binary(), binary()} | binary() Путь к файлу конфигурации.
Так как к файлам конфигурации часто обращаются на целевых машинах, он может быть представлен в виде:
двоичное представление абсолютного пути
{:system, system_var, path}кортеж, где конфигурация является результатом конкатенации переменной окруженияsystem_varс заданнымpath
state()Source
@type state() :: term()
Обработчики
init(термин)Source
@callback init(term()) :: state()
Вызывается при инициализации поставщика конфигурации.
Поставщик конфигурации обычно инициализируется на машине, где собирается система, а не на целевой машине. Обработчик init/1 полезен для проверки предоставленных аргументов и подготовки состояния, которое будет передано в load/2.
Кроме того, так как состояние, возвращаемое init/1, может быть записано в текстовые файлы конфигурации, оно должно быть ограничено только простыми типами данных, такими как целые числа, строки, атомы, кортежи, карты и списки. Элементы, такие как PID, ссылки и функции, сериализовать нельзя.
load(config, state)Source
@callback load(config(), state()) :: config()
Загрузка конфигурации (обычно во время запуска системы).
Он получает текущую config и state состояние, возвращённое init/1. Затем вы обычно читаете дополнительную конфигурацию из внешнего источника и объединяете её с полученным config. Объединение следует выполнять с помощью Config.Reader.merge/2, так как оно выполняет глубокое объединение. Оно должно вернуть обновлённую конфигурацию.
Обратите внимание, что load/2 обычно вызывается очень рано на стадии запуска, поэтому, если вам нужно использовать приложение в поставщике, вы несёте ответственность за его запуск.
Функции
resolve_config_path!(path)Source
@spec resolve_config_path!(config_path()) :: binary()
Преобразует config_path/0 в фактический путь.
validate_config_path!(path)Source
@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.18.1/Config.Provider.html