如何读取 elixir mix 项目的配置文件
Posted
技术标签:
【中文标题】如何读取 elixir mix 项目的配置文件【英文标题】:How to read config files on elixir mix project 【发布时间】:2014-07-16 19:48:43 【问题描述】:我正在创建一个 elixir 项目来搜索文件中的模式。 我想将这些模式存储在配置文件中,以便在应用程序中轻松更改。 我的第一个想法是将这些文件作为 exs 文件存储在 mix 项目的 config 文件夹中。 所以,问题是:
-
有没有简单的方法将配置存储在关键字列表的文件中?
如何在应用程序中加载它?
我看到有像 File 这样的模块来读取文件,但是没有标准的方法来解析 elixir 中的关键字列表吗?我在想类似于 Rails 中的 yml 文件。
【问题讨论】:
为什么不直接使用 Elixir 提供的配置呢?它旨在与 OTP 和现有的 Elixir 应用程序很好地配合使用。为什么要提供新的东西? 你是说 mix.exs 吗?我考虑过,但是对于一个复杂的应用程序,这可能会变得非常拥挤,所以我考虑将它拆分为不同的文件。网络上是否有任何关于如何配置 Elixir 应用程序的正确方法的资源?如果已经有解决方案,我对不重新发明***非常感兴趣。 不,他说的是 0.13.2 中引入的新 config/config.exs 文件。您可以在 mix.exs 中提供配置键,并使用插值来模拟环境配置。 是的,我指的是新的config/config.exs
。如果您获得了最新的 Elixir 并创建了一个新项目,您将看到带有 cmets 的新文件,了解如何使用它。
见groups.google.com/forum/#!topic/elixir-lang-talk/kixyuzLFbbw
【参考方案1】:
您可以使用Mix.Config.read(path)
读取存储在*.exs 文件中的关键字列表。要将 Elixir 术语写入 *.exs 文件,您可以使用 Inspect.Algebra.to_doc(%Inspect.Optspretty: true)
并将生成的字符串内容写入使用 File.write
的文件。它的格式不如你手工制作的好,但它绝对仍然可读。
如果您不介意使用 Erlang 术语,可以分别使用 :file.consult(path)
和 :file.write_file(:io_lib.fwrite('~p.\n', [config]), path)
轻松阅读和编写这些术语。
【讨论】:
这个不错,但是关键字列表配置起来有点太简单了,有没有类似的支持地图的? 文件刚刚被评估。你可以在那里拥有任何你想要的东西。只需检查Mix.Config.read/1
是如何实现的(非常简单)。
你的意思是Mix.Config.read!/1
,对吧?还是自从发布此答案后情况发生了变化?
注意 :file.write_file 的默认编码是 latin1
是的,你可以通过[encoding: :utf8]
作为第三个参数来改变它。【参考方案2】:
使用 Code.eval_file
添加另一个选项,是使用Code.eval_file 将文件评估为代码文件,并将结果作为长生不老药构造返回。
配置文件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"
]
【讨论】:
以上是关于如何读取 elixir mix 项目的配置文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在服务器上正确安装 Erlang、Elixir 和 mix?