如何读取 elixir mix 项目的配置文件

Posted

技术标签:

【中文标题】如何读取 elixir mix 项目的配置文件【英文标题】:How to read config files on elixir mix project 【发布时间】:2014-07-16 19:48:43 【问题描述】:

我正在创建一个 elixir 项目来搜索文件中的模式。 我想将这些模式存储在配置文件中,以便在应用程序中轻松更改。 我的第一个想法是将这些文件作为 exs 文件存储在 mix 项目的 config 文件夹中。 所以,问题是:

    有没有简单的方法将配置存储在关键字列表的文件中? 如何在应用程序中加载它?

我看到有像 File 这样的模块来读取文件,但是没有标准的方法来解析 elixir 中的关键字列表吗?我在想类似于 Rails 中的 yml 文件。

【问题讨论】:

为什么不直接使用 Elixir 提供的配置呢?它旨在与 OTP 和现有的 Elixir 应用程序很好地配合使用。为什么要提供新的东西? 你是说 mix.exs 吗?我考虑过,但是对于一个复杂的应用程序,这可能会变得非常拥挤,所以我考虑将它拆分为不同的文件。网络上是否有任何关于如何配置 Elixir 应用程序的正确方法的资源?如果已经有解决方案,我对不重新发明***非常感兴趣。 不,他说的是 0.13.2 中引入的新 config/config.exs 文件。您可以在 mix.exs 中提供配置键,并使用插值来模拟环境配置。 是的,我指的是新的config/config.exs。如果您获得了最新的 Elixir 并创建了一个新项目,您将看到带有 cmets 的新文件,了解如何使用它。 见groups.google.com/forum/#!topic/elixir-lang-talk/kixyuzLFbbw 【参考方案1】:

您可以使用Mix.Config.read(path) 读取存储在*.exs 文件中的关键字列表。要将 Elixir 术语写入 *.exs 文件,您可以使用 Inspect.Algebra.to_doc(%Inspect.Optspretty: true) 并将生成的字符串内容写入使用 File.write 的文件。它的格式不如你手工制作的好,但它绝对仍然可读。

如果您不介意使用 Erlang 术语,可以分别使用 :file.consult(path):file.write_file(:io_lib.fwrite('~p.\n', [config]), path) 轻松阅读和编写这些术语。

【讨论】:

这个不错,但是关键字列表配置起来有点太简单了,有没有类似的支持地图的? 文件刚刚被评估。你可以在那里拥有任何你想要的东西。只需检查Mix.Config.read/1 是如何实现的(非常简单)。 你的意思是Mix.Config.read!/1,对吧?还是自从发布此答案后情况发生了变化? 注意 :file.write_file 的默认编码是 latin1 是的,你可以通过[encoding: :utf8] 作为第三个参数来改变它。【参考方案2】:

使用 Code.eval_file

添加另一个选项,是使用Code.eval_file 将文件评估为代码文件,并将结果作为长生不老药构造返回。

配置文件config1.ex:

%configKey1: "configValue1", configKey2: "configValue2" 

读取文件:

content, _ = Code.eval_file("config1.ex")

*评估代码文件需要考虑安全性。

关于在@bitwalker 正确答案中使用Mix.Config.read!

配置文件需要采用以下特定格式:

[
   appName: [key1: "val1", key2: "val2"]
]

在Mix.Config.read code 中,它尝试验证内容并期待一个主关键字列表[ , .. ],其中还包括具有关键字列表类型值的键。

代码不长:

 def validate!(config) do
    if is_list(config) do
      Enum.all?(config, fn
        app, value when is_atom(app) ->
          if Keyword.keyword?(value) do
            true
          else
            raise ArgumentError,
              "expected config for app #inspect app to return keyword list, got: #inspect value"
          end
        _ ->
          false
      end)
    else
      raise ArgumentError,
        "expected config file to return keyword list, got: #inspect config"
    end
  end

我们可以绕过并使用不是原子的第一个键,然后验证停止但不抛出:

[
  "mockFirstKey", "mockValue",
  myKey1: "myValue1",
  myKey2: "myValue2"
]

【讨论】:

以上是关于如何读取 elixir mix 项目的配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Elixir 与 Mix 如何制作守护进程?

如何在服务器上正确安装 Erlang、Elixir 和 mix?

Elixir - 基本主管设置崩溃而不是重新启动子进程

如何重新编译 Elixir 项目并从 iex 中重新加载它?

混合(elixir)没有这样的文件或目录

在 elixir 应用程序中访问项目版本