现在我正在学习Erlang,我对运行和测试Erlang应用程序的方式有疑问.
我们对运行和测试Erlang程序有一些看法:
application:start(AppName).我的问题:我们可以从Erlang代码生成二进制可执行文件吗,就像C代码一样?如何在没有Erlang shell的情况下运行程序,我可以运行程序,输入一些命令,之后调用Erlang函数执行此命令?
例如,我有一个test.erl带有三个函数的module():
foo1() -> ...
foo2() -> ...
foo3() -> ...
Run Code Online (Sandbox Code Playgroud)
然后我想在终端运行程序并输入-a标志来调用函数foo1,-b标志foo2等等.
让我把答案分成三个部分:
由于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 &
Run Code Online (Sandbox Code Playgroud)
foo应用程序然后我们可以使用以下命令停止它:
$ 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)
我们也可以使用以下命令附加到foo应用程序shell:
$ erl \
-sname debug_foo_node \
-setcookie foo_secret \
-rmesh foo_node
Run Code Online (Sandbox Code Playgroud)
我们可以将上面的命令放入makefile或shell脚本中,以便简单地使用它们.此外,为了对系统的启动过程进行更精细的控制,我们可以使用启动脚本文件并使用-boot标志指定它.引导文件包含有关如何启动系统,我们依赖哪些模块和应用程序的说明,还包含重新启动,重新启动和停止系统的功能.Erlang文档网站中详细记录了创建和使用引导脚本的过程.
另一种自动化和集成大部分工作的方法是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执行此类任务的详细教程.
Erlang应用程序有两个标准测试框架:
Eunit:它是OTP的标准单元测试框架,可以测试功能,模块,进程甚至应用程序.
CommonTest:它是OTP的另一个标准测试框架,它提供用于定义本地或分布式测试场景的结构,并设法运行,记录和报告结果.
将它们组合在一起用于白盒测试和黑盒测试是常见的做法.还提供了螺纹钢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"]]}
Run Code Online (Sandbox Code Playgroud)