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

时间:2010-11-07 14:21:25

标签: erlang

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

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

  1. 我们可以运行Erlang shell并在那里测试我们的功能。
  2. 我们可以使用我们的Erlang代码编译一些文件,而不是创建.app文件,然后再次运行Erlang shell并调用application:start(AppName)
  3. 我的问题:我们可以从Erlang代码生成二进制可执行文件吗,就像C代码一样?如何在没有Erlang shell的情况下运行程序,我可以运行程序,输入一些命令,之后调用Erlang函数执行此命令?

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

    foo1() -> ...
    
    foo2() -> ...
    
    foo3() -> ...
    

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

3 个答案:

答案 0 :(得分:7)

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

1。运行Erlang应用程序

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

一种。命令行标志

想象一下,我们开发了一个名为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应用程序和发布更简单。关于如何使用Rebar进行此类任务,有一个detailed tutorial

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"]]}

答案 1 :(得分:4)

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

答案 2 :(得分:1)

您还应该查看eunit,它可以自动化运行自动化单元测试的麻烦。