Spec-Zone.ru › Elixir 1.10

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

Затем при указании релиза вы можете указать поставщика в конфигурации релиза:

releases: [
  demo: [
    # ...,
    config_providers: [{JSONConfigProvider, "/etc/config.json"}]
  ]
]

Теперь, после загрузки системы, она вызовет поставщика на ранней стадии процесса загрузки, сохранит объединённую конфигурацию на диск и перезапустит систему с новыми значениями.

Сводка

Типы

config()
config_path()

Путь к файлу конфигурации.

state()

Функции

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.10.4/Config.Provider.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API