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

0xA*_*xAX 5 erlang

现在我正在学习Erlang,我对运行和测试Erlang应用程序的方式有疑问.

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

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

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

例如,我有一个test.erl带有三个函数的module():

foo1() -> ...

foo2() -> ...

foo3() -> ...
Run Code Online (Sandbox Code Playgroud)

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

Ham*_*ani 7

让我把答案分成三个部分:

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 &
Run Code Online (Sandbox Code Playgroud)
  • -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 &
Run Code Online (Sandbox Code Playgroud)
  • -eval评估给定的表达式

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

$ erl \
-sname debug_foo_node \
-setcookie foo_secret \
-rmesh foo_node
Run Code Online (Sandbox Code Playgroud)
  • -rmesh为给定节点创建一个远程shell

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

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
Run Code Online (Sandbox Code Playgroud)

我们可以使用Rebar这是一个Erlang构建工具,使创建Erlang应用程序和发布更简单.有关如何使用Rebar执行此类任务的详细教程.

2.测试Erlang应用程序

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

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

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

将它们组合在一起用于白盒测试和黑盒测试是常见的做法.还提供了螺纹钢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"]]}
Run Code Online (Sandbox Code Playgroud)


Zei*_*ssS 5

不,你不能制作二进制文件。您可以编写 bash 或 escript 来自动运行启动/测试代码。