要启动我的程序,我会执行下一个序列:
$ erl
> c(module1).
> c(module2).
> c(modulen).
modulen:start().
是否有可能创建允许我启动程序的脚本?
答案 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