[英]How to read config files on elixir mix project
我正在創建一個elixir項目來搜索文件中的模式。 我想將這些模式存儲為配置文件,以便在應用程序中輕松更改。 我的第一個想法是將這些文件作為exs文件存儲在mix項目的config文件夾中。 所以,問題是:
我看到有像File這樣的模塊來讀取文件,但是沒有標准方法來解析elixir中的關鍵字列表嗎? 我在想與Rails中的yml文件類似的東西。
您可以使用Mix.Config.read(path)
讀取存儲在* .exs文件中的關鍵字列表。 要將Elixir術語寫入* .exs文件,可以使用Inspect.Algebra.to_doc(%Inspect.Opts{pretty: true})
並使用File.write
將生成的字符串內容寫入文件。 它的格式不如你手工制作,但它絕對可讀。
如果您不介意使用Erlang術語,可以使用:file.consult(path)
輕松讀取和寫入:file.consult(path)
和:file.write_file(:io_lib.fwrite('~p.\\n', [config]), path)
分別。
使用Code.eval_file
添加另一個選項是使用Code.eval_file將文件評估為代碼文件,並將結果作為elixir構造返回。
配置文件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"
]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.