gpt4 book ai didi

erlang - 如何将 Erlang 应用程序编译成可执行二进制文件并运行它?

转载 作者:行者123 更新时间:2023-12-02 09:34:16 27 4
gpt4 key购买 nike

现在我正在学习 Erlang,我有一个关于运行和测试 Erlang 应用程序的问题。

我们对运行和测试 Erlang 程序有一些看法:

  1. 我们可以运行 Erlang shell 并在其中测试我们的函数。
  2. 我们可以使用 Erlang 代码编译一些文件,然后创建 .app 文件,然后再次运行 Erlang shell 并调用 application:start(AppName)

我的问题:我们可以像 C 代码一样从 Erlang 代码制作二进制可执行文件吗?如何在没有 Erlang shell 的情况下运行程序,以便我可以运行程序、输入命令,然后调用该命令的 Erlang 函数?

例如,我有一个具有三个功能的模块(test.erl):

foo1() -> ...

foo2() -> ...

foo3() -> ...

然后我想在终端中运行程序并输入 -a 标志来调用函数 foo1,输入 -b 标志来调用 foo2 等等。

最佳答案

让我将答案分为三个部分:

1。运行 Erlang 应用程序

由于 Erlang 源代码(.erl 文件)编译为 BEAM 字节码(.beam 文件),然后在 Erlang 虚拟机(BEAM)之上运行,因此无法选择创建独立的二进制文件而不需要虚拟机。但是,有一些方法可以基于 OTP(其正式平台)来打包、构建、移植、升级和运行 Erlang 应用程序。

A.命令行标志

假设我们开发了一个名为 foo 的应用程序,现在我们可以使用一组标志来启动它,如下所示:

$ erl \
-pa path/to/foo \
-s foo \
-sname foo_node \
-setcookie foo_secret \
-noshell -noinput > /path/to/foo.log &
  • -pa将指定目录添加到路径
  • -s 启动 foo 应用程序
  • -sname 使其以短名称分发
  • -setcookie 设置 cookie 以实现最低安全级别
  • -noshell 启动没有 shell 的 erlang
  • -noinput 不允许从 shell 读取任何输入

然后我们可以使用以下命令停止它:

$ erl \
-sname stop_foo_node \
-setcookie foo_secret \
-eval 'rpc:call(foo, foo_node, stop, []), init:stop()' \
-noshell -noinput > /path/to/foo.log &
  • -eval 计算给定的表达式

我们还可以使用以下命令附加到 foo 应用程序 shell:

$ erl \
-sname debug_foo_node \
-setcookie foo_secret \
-rmesh foo_node
  • -rmesh 为给定节点创建远程 shell

我们可以将以上命令放入makefile或shell脚本中以便简单使用。另外,为了对系统的启动过程进行更细粒度的控制,我们可以使用启动脚本文件并使用 -boot 标志指定它。引导文件包含如何启动系统、依赖哪些模块和应用程序的说明,还包含重新启动、重新启动和停止系统的功能。创建和使用启动脚本的过程在Erlang documentation website中有详细记录。 .

B.发布工具

为我们自动化和集成大部分工作的另一种方式是 reltool这是一个标准且功能齐全的发布管理工具。我们可以在 reltool 配置文件中指定应用程序版本、启动脚本、依赖项等并创建可移植版本。这是与 reltool 兼容的 Erlang/OTP 应用程序的示例结构:

├── deps
│ └── ibrowse
├── ebin
│ ├── foo.app
│ ├── foo_app.beam
│ └── foo_sup.beam
├── rebar.config
├── rel
│ ├── files
│ ├── foo
│ └── reltool.config
└── src
├── foo_app.erl
├── foo.app.src
└── foo_sup.erl

我们可以使用Rebar这是一个 Erlang 构建工具,可以使创建 Erlang 应用程序和发布变得更加简单。有一个detailed tutorial关于如何使用 Rebar 来完成此类任务。

2。测试 Erlang 应用程序

Erlang 应用程序有两个标准测试框架:

  • Eunit:它是OTP的标准单元测试框架,可以测试功能、模块、进程甚至应用程序。

  • CommonTest:它是 OTP 的另一个标准测试框架,提供用于定义本地或分布式测试场景的结构,并管理运行、记录和报告结果。

将它们组合在一起进行白盒和黑盒测试是一种常见的做法。 Rebar 还提供了 rebar eunitrebar ct 命令来自动执行它们。

3。传递命令行参数

使用init:get_argument/1我们可以检索用户定义的标志来决定它们,如下所示:

$ erl -foo foo1 foo2 -bar bar1
1> init:get_argument(foo).
{ok,[["foo1","foo2"]]}
2> init:get_argument(bar).
{ok,[["bar1"]]}

关于erlang - 如何将 Erlang 应用程序编译成可执行二进制文件并运行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4118118/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com