我正在编写我的第一个erlang应用程序,我还不了解erlang生态系统的某些部分以及应该如何处理它。例如,如果我的应用程序依赖于其他一些应用程序,那么立即启动并停止的方法是什么?实际上,我已经想出了如何启动,只需将application:start/1
调用放在应用程序模块的start/2
函数中:
-module(myapp).
-behaviour(application).
-export([start/0, start/2, stop/1]).
start(_Type, _StartArgs) ->
ok = application:start(ssl),
ok = application:start(inets),
ok = application:start(log4erl),
myapp_sup:start_link().
stop(_State) ->
ok.
但是当我尝试将相应的application:stop/1
调用放入myapp:stop/1
函数并从erlang shell application:stop(myapp)
调用时,后来只是停止响应任何命令。
答案 0 :(得分:4)
阅读官方文件:
在应用程序之后停止/ 1称为 已停止,应该做任何事情 必要的清理。请注意 实际停止申请, 那是关闭的 监督树,处理 自动按照Starting and Stopping Applications。
中的说明
通常,当我有一些依赖的应用程序时,我使用.app资源文件,在那里我列出了我的应用程序需要启动(或加载)的所有应用程序才能正常工作。
答案 1 :(得分:3)
我建议您查看erlware.org并使用sinan和faxien工具进行Erlang开发。如果您的应用程序和版本坚持严格的OTP合规性,它不仅使开发更容易,更不容易出错,而且使共享应用程序变得更加容易。即将出版的书http://www.manning.com/logan/回答得更多,你可以阅读pdf格式的早期版本。
在模块中“随机”开始和停止是一个坏主意。
答案 2 :(得分:0)
你已经有了一些很好的建议。让我简单地添加一个您正在看到的问题的解释:应用程序控制器同步调用您的stop
回调函数,即,在函数返回之前,应用程序控制器不会执行任何其他操作。但是你要求应用程序控制器停止其他一些应用程序 - 这两个进程陷入僵局,等待彼此。