erlang - 启动脚本

时间:2009-12-08 10:11:42

标签: erlang

要启动我的程序,我会执行下一个序列:

$ erl
> c(module1).
> c(module2).
> c(modulen).
modulen:start().

是否有可能创建允许我启动程序的脚本?

6 个答案:

答案 0 :(得分:12)

您可以使用加载器脚本来负责以OTP方式启动应用程序:

-module(XYZ_app).

-export([start/0]).

start() ->
    application:start(inets),
    application:start(XYZ).

您通过shell脚本启动该脚本。如果您计划在操作系统启动时运行守护进程,请注意使用escript,因为它们很棘手。

#!/bin/bash
erl -boot start_sasl -s XYZ_app start

当然你需要你的XYZ.app文件(只是一个例子):

{application, tinycouch,
 [{description, "tinycouch"},
  {vsn, "0.1"},
  {modules, [
         tinycouch, tinycouch_app, tinycouch_sup,
         tinycouch_server, tinycouch_logger_h, tinycouch_utils,
         tinycouch_db, mod_tinycouch
        ]},
  {registered, [tinycouch
            ,tinycouch_server
            ,tinycouch_sup
           ]},
  {applications, [kernel, stdlib, sasl, inets]},
  {env, []},

  %% Application Start point
  {mod, {tinycouch_sup, []}}]}.

...并且所有.erl文件都必须已编译。

注意如果您打算分发您的应用程序(例如Debian存储库等),您可能应该考虑使用make文件来编译和安装您的应用程序。

最后一点:你也可以使用boot文件(最终的OTP方式),但我发现这些非常有限:启动文件将你的应用程序绑定到特定的版本发布Erlang(以及其他相关应用程序)。您的应用程序可能能够在各种Erlang版本中运行,但您需要为要发送的每个“平台版本”都有一个单独的构建/发布过程。

答案 1 :(得分:2)

您可以使用erlc

编译模块
erlc module1 module2 module3

您还可以创建一个脚本来运行程序

#!/usr/bin/escript

main(_) ->
    modulen:start().

然后在控制台中:

chmod +x start.erl
./start.erl

答案 2 :(得分:2)

两种方式

预编译您的代码

$ erlc module1.erl
$ erl -s module1 funcname arg1 arg2 ....

或使用escript

#!/usr/bin/env escript
main() ->
    module1:fun(...)

escript是Erlang的脚本界面

答案 3 :(得分:1)

您可以直接使用erl -make,因为它假定所有*.erl文件都应编译为*.beam,如果自上次编译后没有更改,则跳过它。查看make module,了解您可以在Emakefile中添加哪些内容来更改某些行为。

使用plain Makefile来调用此编译策略也为其他用户提供了熟悉的构建过程。

具有jldupont建议的引导启动功能是启动开发环境的好方法。在某种程度上用于生产甚至足够精细。<​​/ p>

下一步是使用完整的OTP(*.rel)版本文件并生成启动脚本,以*.app指定彼此依赖关系的顺序启动所有应用程序。

答案 4 :(得分:1)

在主目录中,创建文件 .erlang

在该文件中写入

compile:file(/path-to/module1).
compile:file(/path-to/module2).
compile:file(/edit-real-path-to/modulen). % etcetera; do not use c(module) inside this file!

然后,如果需要添加(在.erlang内部):

module1:start(). % etc

在外壳中运行erl时,.erlang(如果此文件位于主目录中)的内容将在启动时(您启动的解释器-erlang-VM)执行。

您可以在其他(某些“当前”)目录中创建.erlang文件,然后,如果在该目录中运行erl(erlang解释器),则另一个.erlang将覆盖主目录中该.erlang的内容。 (例如/ home /您的用户名/.erlang)。

最好在.erlang内部编写一些提醒,例如

io:format(".erlang loaded-compiled module1!\n"). %etc 

(以免忘记该代码,否则该代码将以静默方式执行!)

(对于这种情况,您还可以检查,例如,在启动后确实以这种方式或类似的方式编译并加载了module1:

AllLoaded = code:all_loaded().
lists:filter(fun({Module,_})-> Module =:= module1 end, AllLoaded).

答案应该是这样的: [{module1,“ / home /您的用户名/(您的代码的路径)/module1.beam”}] )

答案 5 :(得分:-1)

查看Sinan和Faxien:http://www.erlware.org