Elixir 配置提供程序

Vys*_*ary 3 elixir

我的任务是读取应用程序运行时的 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
Run Code Online (Sandbox Code Playgroud)

当我尝试通过 iex 运行它时,一切看起来都很好

JSONConfigProvider.load([existing: :config, app: [:appname]],"file_path")
Run Code Online (Sandbox Code Playgroud)

下一步是然后在指定您的发布时,您可以在发布配置中指定提供者

我没有混合版本。有什么方法可以将其存储在配置(dev.ex)中吗?

Ale*_*kin 5

\n

我的任务是在运行时读取 JSON 文件Application并将其存储在配置中。

\n
\n\n

应用程序 config和[通常]加载此配置的配置文件之间存在混淆。

\n\n

ConfigProvider用于将配置从.json文件加载到应用程序配置中。默认情况下,应用程序只会加载.exs配置,因此您实际需要的是指示您的应用程序使用新的提供程序从.json.

\n\n

我们是否谈论发布并不重要。如果没有语法糖,人们可能会从文件加载 JSONApplication.put_all_env/2通过或Application.put_env/4进行微调来动态更改应用程序配置。

\n\n

版本在很多方面都有所不同(它超出了这个问题的范围),这就是文档建议更改文件releases部分的原因project。要加载它进行开发,您只需执行以下操作:

\n\n
defmodule MyApp.Application do\n  @moduledoc false\n  use Application\n\n  @spec start(Application.app(), Application.restart_type()) ::\n        Supervisor.on_start()\n  def start(_type, _args) do\n    config =\n      JSONConfigProvider.load(\n        [existing: :config, app: [:my_app]], "file_path")\n    Application.put_all_env({:my_app, config}, persistent: true)\n\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n