如何将 Erlang sys.config 转换为 Elixir config.exs?
Posted
技术标签:
【中文标题】如何将 Erlang sys.config 转换为 Elixir config.exs?【英文标题】:How to convert Erlang sys.config into Elixir config.exs? 【发布时间】:2016-02-11 04:07:33 【问题描述】:这可能很简单。 比如把这个 sys.config 放到 mix config.exs 里:
gsms, [interfaces,
[
gsms_0705, 1, [device,"/dev/tty.usbserial-FTF5DP2J",
bnumber, "<phone-number>",baud,19200,
reopen_timeout, 5000]
gsms_0705, 2, [device,"/dev/tty.HUAWEIMobile-Pcui",
bnumber, "<phone-number>",
reopen_timeout, 5000]
gsms_0705, 3, [device, "/dev/tty.usbserial",
bnumber, "<phone-number>",
baud, 9600]
]
]
【问题讨论】:
【参考方案1】:我想是这样的:
config :gsms, :interfaces, [
:gsms_0705, 1, [device: '/dev/tty.usbserial-FTF5DP2J',
bnumber: '<phone-number>',
baud: 19200,
reopen_timeout: 5000],
# and so on
]
其中:gsms
是您正在配置的应用程序,:interfaces
是您将通过Application.get_env/2
(Application.get_env(:gsms, :interfaces)
) 检索的键,:gsms_*, ...
元组列表是该键的值。
【讨论】:
【参考方案2】:如果您修复语法错误(缺少逗号)并添加强制性尾随点,您甚至可以从 Elixir 解析 Erlang 术语并让解析器为您进行转换:
erlang_term = 'gsms, [interfaces, [
gsms_0705, 1, [device,"/dev/tty.usbserial-FTF5DP2J",
bnumber, "<phone-number>",baud,19200,
reopen_timeout, 5000],
gsms_0705, 2, [device,"/dev/tty.HUAWEIMobile-Pcui",
bnumber, "<phone-number>",
reopen_timeout, 5000],
gsms_0705, 3, [device, "/dev/tty.usbserial",
bnumber, "<phone-number>",
baud, 9600]
]
].'
:ok, tokens, _ = :erl_scan.string(erlang_term)
:ok, result = :erl_parse.parse_term(tokens)
IO.inspect result, limit: :infinity
打印出来:
:gsms,
[interfaces: [:gsms_0705, 1,
[device: '/dev/tty.usbserial-FTF5DP2J', bnumber: '<phone-number>',
baud: 19200, reopen_timeout: 5000],
:gsms_0705, 2,
[device: '/dev/tty.HUAWEIMobile-Pcui', bnumber: '<phone-number>',
reopen_timeout: 5000],
:gsms_0705, 3,
[device: '/dev/tty.usbserial', bnumber: '<phone-number>', baud: 9600]]]
元组的第一部分是应用程序名称:gsms
,元组的另一部分是包含实际选项的proplist。你可以去掉周围的括号并重新格式化一下,你会得到:
config :gsms, interfaces: [
:gsms_0705, 1, [
device: '/dev/tty.usbserial-FTF5DP2J',
bnumber: '<phone-number>',
baud: 19200,
reopen_timeout: 5000],
:gsms_0705, 2, [
device: '/dev/tty.HUAWEIMobile-Pcui',
bnumber: '<phone-number>',
reopen_timeout: 5000],
:gsms_0705, 3, [
device: '/dev/tty.usbserial',
bnumber: '<phone-number>',
baud: 9600]]
【讨论】:
以上是关于如何将 Erlang sys.config 转换为 Elixir config.exs?的主要内容,如果未能解决你的问题,请参考以下文章