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

File 如何读取elixir mix项目上的配置文件,file,parsing,elixir,elixir-mix,File,Parsing,Elixir,Elixir Mix,我正在创建一个elixir项目来搜索文件中的模式。 我想将这些模式存储在配置文件中,以便在应用程序中轻松更改。 我的第一个想法是将这些文件作为exs文件存储在mix项目的config文件夹中。 因此,问题是: 有没有简单的方法将配置存储在关键字列表中 如何将其加载到应用程序中 我看到有像File这样的模块来读取文件,但是在elixir中没有解析关键字列表的标准方法吗?我在想一些类似于Rails中的yml文件的东西。您可以使用Mix.Config.read(path)读取存储在*.exs文件中的关

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

  • 有没有简单的方法将配置存储在关键字列表中
  • 如何将其加载到应用程序中
    我看到有像File这样的模块来读取文件,但是在elixir中没有解析关键字列表的标准方法吗?我在想一些类似于Rails中的yml文件的东西。

    您可以使用
    Mix.Config.read(path)
    读取存储在*.exs文件中的关键字列表。要将长生不老药术语写入*.exs文件,可以使用
    Inspect.Algebra.to_doc(%Inspect.Opts{pretty:true})
    并使用
    file.write
    将结果字符串内容写入文件。它的格式不像你用手做的那样好,但它肯定还是可读的


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

    使用code.eval\u文件

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

    配置文件
    config1.ex

    %{configKey1: "configValue1", configKey2: "configValue2"} 
    
    正在读取文件:

    {content, _} = Code.eval_file("config1.ex")
    
    *评估代码文件需要考虑安全性

    关于使用
    Mix.Config.read

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

    [
       appName: [key1: "val1", key2: "val2"]
    ]
    
    在中,它尝试验证内容,并期望出现一个主关键字列表
    [{},{}..]
    ,其中包括同样具有关键字列表类型值的关键字

    代码不长:

     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
    
    我们可以绕过并使用非atom的第一个密钥,然后验证停止,但不会抛出:

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

    这很好,但是关键字列表对于配置来说有点太简单了,没有任何类似的支持地图的东西吗?文件只是评估。你可以在那里得到你想要的任何东西。只要检查一下
    Mix.Config.read/1
    是如何实现的(这很简单)。你是说
    Mix.Config.read/1
    ,对吗?或者,自发布此答案后,情况发生了变化吗?请注意:file.write\u file的默认编码是Latin1是的,您可以将
    [encoding::utf8]
    作为第三个参数来更改它。为什么不简单地使用Elixir提供的配置呢?这意味着与OTP和现有的长生不老药应用程序配合良好。为什么要提供新的东西?你是说mix.exs?我考虑过,但对于一个复杂的应用程序,这可能会变得非常拥挤,所以我考虑将其拆分为不同的文件。网络上是否有关于如何正确配置Elixir应用程序的资源?如果已经有解决方案的话,我对不重新发明轮子很感兴趣。不,他说的是0.13.2中引入的新config/config.exs文件。您可以在mix.exs中提供config键,并使用插值按环境模拟config。是的,我指的是新的
    config/config.exs
    。如果您获得了最新的Elixir并创建了一个新项目,您将看到新文件,其中包含关于如何使用它的注释。请参阅