【问题标题】:How to compile an Erlang application into executable binary and run it?如何将 Erlang 应用程序编译成可执行的二进制文件并运行它?
【发布时间】:2011-05-06 07:26:50
【问题描述】:

现在我正在学习 Erlang,我有一个关于运行和测试 Erlang 应用程序的问题。

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

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

我的问题:我们可以像 C 代码一样从 Erlang 代码制作二进制可执行文件吗?如何在没有 Erlang shell 的情况下运行程序,以一种我可以运行程序、输入一些命令然后为该命令调用 Erlang 函数的方式?

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

foo1() -> ...

foo2() -> ...

foo3() -> ...

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

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

    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 &
    
    • -eval 计算给定的表达式

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

    $ 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 应用程序和发布。有一个detailed tutorial 介绍如何使用 Rebar 来完成此类任务。

    2。测试 Erlang 应用程序

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

    • Eunit:是OTP的标准单元测试框架,可以测试一个功能、一个模块、一个流程甚至是一个应用程序。

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

    将它们组合在一起进行白盒和黑盒测试是一种常见的做法。 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"]]}
    

    【讨论】:

      【解决方案2】:

      您还应该检查一下 eunit,它可以自动化运行自动化单元测试的许多麻烦。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2012-08-01
          • 2012-04-09
          • 2015-10-29
          • 2012-09-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多