簡體   English   中英

如何在elixir mix項目中讀取配置文件

[英]How to read config files on elixir mix project

我正在創建一個elixir項目來搜索文件中的模式。 我想將這些模式存儲為配置文件,以便在應用程序中輕松更改。 我的第一個想法是將這些文件作為exs文件存儲在mix項目的config文件夾中。 所以,問題是:

  1. 有沒有簡單的方法將配置存儲在關鍵字列表的文件中?
  2. 我如何在應用程序中加載它?

我看到有像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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM