我正在创建一个 elixir 项目来搜索文件中的模式。我想将这些模式存储在配置文件中,以便在应用程序中轻松更改。我的第一个想法是将这些文件作为 exs 文件存储在 mix 项目的 config 文件夹中。所以,问题是:
- 有没有简单的方法将配置存储在文件 aa 关键字列表中?
- 我将如何在应用程序中加载它?
我看到有像 File 这样的模块来读取文件,但是没有标准的方法来解析 elixir 中的关键字列表吗?我在想类似于 Rails 中的 yml 文件。
我正在创建一个 elixir 项目来搜索文件中的模式。我想将这些模式存储在配置文件中,以便在应用程序中轻松更改。我的第一个想法是将这些文件作为 exs 文件存储在 mix 项目的 config 文件夹中。所以,问题是:
我看到有像 File 这样的模块来读取文件,但是没有标准的方法来解析 elixir 中的关键字列表吗?我在想类似于 Rails 中的 yml 文件。
您可以使用 .exs 文件读取存储在 *.exs 文件中的关键字列表Mix.Config.read(path)
。要将 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)
。
使用 Code.eval_file
添加另一个选项是将文件评估为代码文件,使用Code.eval_file并将结果作为长生不老药构造返回。
配置文件config1.ex
:
%{configKey1: "configValue1", configKey2: "configValue2"}
读取文件:
{content, _} = Code.eval_file("config1.ex")
*评估代码文件需要考虑安全问题。
关于Mix.Config.read!
在@bitwalker 中使用正确答案
配置文件需要采用以下特定格式:
[
appName: [key1: "val1", key2: "val2"]
]
在Mix.Config.read 代码中,它尝试验证内容并期望一个主关键字列表[ {}, {}.. ]
,其中包括具有关键字列表类型值的键。
代码不长:
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"
]