Конфигураторы Elixir - PullRequest
0 голосов
/ 28 апреля 2020

Моя задача - прочитать файл JSON в Приложении и сохранить его в конфигурации. Я прошел через https://hexdocs.pm/elixir/master/Config.Provider.html

Теперь мой код провайдера конфигурации:

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!()

    json
  end
end

Когда я пытаюсь запустить это через iex, все выглядит нормально

JSONConfigProvider.load([existing: :config, app: [:appname]],"file_path")

и следующий шаг - Затем при указании вашего выпуска вы можете указать поставщика в конфигурации выпуска

У меня нет смешанного выпуска. Есть ли способ сохранить это в конфиге (dev.ex)?

1 Ответ

1 голос
/ 28 апреля 2020

Моя задача - прочитать файл JSON при запуске Application и сохранить его в конфигурации.

Существует путаница между конфигурацией приложения и файлами конфигурации , из которых [обычно] загружается эта конфигурация.

ConfigProvider используется для загрузки конфигурации из файла .json в config приложения . По умолчанию приложение будет загружать только .exs конфигов, поэтому на самом деле вам нужно будет указать вашему приложению использовать нового провайдера для загрузки конфигурации из .json.

Не имеет значения, мы говорим о релизах или нет. Без syntacti c sugar можно загрузить JSON из файла и , изменить конфигурацию приложения на лету с помощью Application.put_all_env/2 или Application.put_env/4 для тонкой настройки.

Релизы во многом отличаются (это выходит за рамки этого вопроса), поэтому в документации предлагается изменить раздел releases файла project. Чтобы загрузить его для разработки, вы просто делаете:

defmodule MyApp.Application do
  @moduledoc false
  use Application

  @spec start(Application.app(), Application.restart_type()) ::
        Supervisor.on_start()
  def start(_type, _args) do
    config =
      JSONConfigProvider.load(
        [existing: :config, app: [:my_app]], "file_path")
    Application.put_all_env({:my_app, config}, persistent: true)

    ...
...