如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期时间转换为erlang中的日期名称和月份名称?

如何在 Erlang 中将整数转换为二进制?

如何在 Erlang 中将重音字符串转换为常规字符串?

ruby 将erlang_program.prompt.erl转换为ruby

将erlang套接字存储到数据库

如何在 CouchDB 中创建 Erlang 视图