让我把答案分成三个部分:
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 &
我们也可以使用以下命令附加到 foo 应用程序外壳:
$ erl \
-sname debug_foo_node \
-setcookie foo_secret \
-rmesh foo_node
我们可以把上面的命令放到一个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 应用程序有两种标准测试框架:
将它们组合在一起进行白盒和黑盒测试是一种常见的做法。 Rebar 还提供了rebar eunit 和rebar 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"]]}