Erlang 我可以在其他应用程序或模块中使用现有OTP应用程序吗?
我正在构建一个需要使用以前构建的OTP应用程序(我们称之为X)的系统。例如,如果我想构建一个新的OTP应用程序/模块,如何使用模块中已经存在的应用程序 我假设我可以调用Erlang 我可以在其他应用程序或模块中使用现有OTP应用程序吗?,erlang,otp,erlang-shell,Erlang,Otp,Erlang Shell,我正在构建一个需要使用以前构建的OTP应用程序(我们称之为X)的系统。例如,如果我想构建一个新的OTP应用程序/模块,如何使用模块中已经存在的应用程序 我假设我可以调用start,因为它遵循应用程序的行为,因此我构建了一个具有以下代码的简约应用程序Y: y、 厄尔: -module(y). -behaviour(application). start(_StartType, _StartArgs) -> io:format("going to call x_app~n"), {o
start
,因为它遵循应用程序
的行为,因此我构建了一个具有以下代码的简约应用程序Y:
y、 厄尔:
-module(y).
-behaviour(application).
start(_StartType, _StartArgs) ->
io:format("going to call x_app~n"),
{ok, _} = x_app:start([]),
io:format("called x_app~n"),
y:start_link().
stop(_State) ->
ok = x_app:stop([]),
ok.
钢筋会成功编译此代码,并且不会生成任何警告。rel/y/bin/y start
什么也不输出(我希望至少得到一个io:format
的输出)
rel/y/bin/y stop
输出节点未运行
您需要将应用程序x
列为您的中的从属应用程序,或者因为您正在使用钢筋
,所以在.app.src
文件中:
{application, your_app,
[{description,"your application"},
{vsn, "0.1"},
{modules,[]},
{registered, []},
{mod,{your_app,[]}},
{env, []},
{applications,[kernel, stdlib, x]}]}.
请注意,在最后一行中,
x
被列为应用程序依赖项。这将导致Erlang应用程序控制器确保在启动应用程序之前启动x
。如果您通过此声明在Erlang shell中以交互方式启动应用程序,将确保在应用程序启动之前先启动x
。非常感谢您的回答。因此,这意味着如果我使用application:start(y)。
在正确配置x.app.src
之后,我会看到预期的结果吗?我可能应该删除x_应用程序:开始([])。
行?正确,您不应该从您自己的代码启动应用程序,如图所示。如果y
依赖于x
,请在y.app.src
中列出x
,如我所示,正常的Erlang释放启动机制将确保它们以正确的顺序启动。停止应用程序如何?调用application:stop(y)
是否也终止x
?运行application:stop(y)
仅停止应用程序y
。但如果您正在运行一个版本,关闭该节点将按与启动顺序相反的顺序停止所有应用程序。至于<代码> ReBar生成错误,也许这个问题会有帮助:这里有一个RiBiWiki:也可以看到这个问题,并且你也可以考虑切换到它,因为它比发布代码[Reals> ReBub处理得好很多。