现在我正在学习Erlang,我对运行和测试Erlang应用程序的方式有疑问。
我们对运行和测试Erlang程序有一些看法:
application:start(AppName)
。我的问题:我们可以从Erlang代码生成二进制可执行文件吗,就像C代码一样?如何在没有Erlang shell的情况下运行程序,我可以运行程序,输入一些命令,之后调用Erlang函数执行此命令?
例如,我有一个具有三个功能的模块(test.erl
):
foo1() -> ...
foo2() -> ...
foo3() -> ...
然后我想在终端中运行程序并输入-a
标志来调用函数foo1
,-b
标记foo2
等等。
答案 0 :(得分:7)
让我把答案分成三个部分:
将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 &
foo
应用程序然后我们可以使用以下命令停止它:
$ erl \
-sname stop_foo_node \
-setcookie foo_secret \
-eval 'rpc:call(foo, foo_node, stop, []), init:stop()' \
-noshell -noinput > /path/to/foo.log &
我们也可以使用以下命令附加到foo应用程序shell:
$ erl \
-sname debug_foo_node \
-setcookie foo_secret \
-rmesh foo_node
我们可以将上面的命令放入makefile或shell脚本中,以便简单地使用它们。
此外,为了更好地控制系统的启动过程,我们可以使用启动脚本文件并使用-boot
标志指定它。引导文件包含有关如何启动系统,我们依赖哪些模块和应用程序的说明,还包含重新启动,重新启动和停止系统的功能。 Erlang documentation website。
为我们自动化和集成大部分作品的另一种方式是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。
Erlang应用程序有两个标准测试框架:
Eunit:它是OTP的标准单元测试框架,可以测试功能,模块,流程甚至应用程序。
CommonTest:它是OTP的另一个标准测试框架,它提供了用于定义本地或分布式测试场景的结构,并设法运行,记录和报告结果。
将它们组合在一起进行白盒测试和黑盒测试是一种常见做法。此外,Rebar还提供rebar eunit
和rebar ct
命令来自动执行。
使用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,它可以自动化运行自动化单元测试的麻烦。