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

时间:2014-05-27 19:12:33

标签: file parsing elixir mix

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

  1. 有没有简单的方法将配置文件存储在关键字列表中?
  2. 我如何在应用中加载它?
  3. 我看到有像File这样的模块来读取文件,但有没有标准的方法来解析elixir中的关键字列表?我在思考类似于Rails中的yml文件。

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

使用Code.eval_file

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

配置文件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"
]