【问题标题】:Yaml Runtime Configuration for Phoenix FrameworkPhoenix 框架的 Yaml 运行时配置
【发布时间】:2020-11-20 11:42:11
【问题描述】:

我正在使用 Elixir (具体来说是 Phoenix),并且有一个我在文档中找不到的问题。

我来自 Java 世界,标准做法是创建一个 Jar,并拥有一个配置文件 (Yaml/TOML/JSON),该文件在 Web 应用程序启动时读取以加载配置。这样,“已编译”的 JAR 可以保持不变,而只有配置在部署环境之间发生变化。

例如。 cat /mnt/appconfig.yaml 可能会显示

local-dev:
    key1: value1
    key2: value2

development:
    key1: value1
    key2: value2

staging:
    key1: value1
    key2: value2

production:
    key1: value1
    key2: value2

如果我使用realm=production java -jar myapp.jar 运行我的应用程序,那么它会从production 块中获取值,这些值可以保存在静态类中并在应用程序的任何位置使用。 KV 是诸如用于访问不同领域中不同服务的 URL、一些随机标志等的东西。

我想知道 Elixir 的做法是什么?

【问题讨论】:

  • 您应该了解发布。另请查看Config
  • 嘿@AdamMillerchip,感谢您的回复。是的,我已经查看了您提到的链接。但是,看起来所有这些都是编译时解决方案,而不是运行时配置。那里有什么我遗漏的具体内容吗?
  • 添加了答案。

标签: configuration elixir phoenix-framework


【解决方案1】:

Beam 版本类似于 JVM jar 文件。您可以指定发行版将使用的runtime_config_path,并将配置文件放在该位置(在编译时)。

来自mix releasedocumentation

应用配置

Releases 提供了两种配置 OTP 应用程序的机制:构建时和运行时。

构建时配置

每当您调用mix 命令时,Mix 都会在config/config.exs 中加载配置,如果该文件存在的话。 config/config.exs 文件本身导入其他文件是很常见的 基于当前MIX_ENV的配置,如 config/dev.exsconfig/test.exsconfig/prod.exs。我们说 该配置是构建时配置,因为它是 每当您编译代码或组装 释放。

换句话说,如果您的配置执行以下操作:

config :my_app, :secret_key, System.fetch_env!("MY_APP_SECRET_KEY")

:secret_key 下的键 :my_app 将在主机上计算,只要发布 建成。在开始之前设置MY_APP_SECRET_KEY release 将无效。

幸运的是,版本还提供运行时 配置,我们接下来会看到。

运行时配置

要在您的发行版中启用运行时配置,您需要做的就是创建一个名为 config/runtime.exs:

import Config
config :my_app, :secret_key, System.fetch_env!("MY_APP_SECRET_KEY")

这个文件将被执行 每当您的 Mix 项目或发布开始时。您的 config/runtime.exs 文件需要遵循三个重要规则:

  • 它必须在顶部 import Config 而不是已弃用的 use Mix.Config
  • 不得通过以下方式导入任何其他配置文件 import_config
  • 它绝不能以任何方式访问Mix,因为Mix 是 构建工具和 它在版本中不可用

如果存在config/runtime.exs,它将被复制到您的发行版并在早期执行 启动过程,只有 Elixir 和 Erlang 的主要应用程序有 已开始。加载配置后,Erlang 系统将 重新启动(在同一操作系统进程中)和新的 将进行配置。

您可以更改运行时的路径 通过在每个配置文件中设置:runtime_config_path 发布配置。此路径在构建时解析为 给定的配置文件总是被复制到版本内部: releases: [ demo: [ runtime_config_path: ... ]]

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多