Erlang 我可以在其他应用程序或模块中使用现有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

我正在构建一个需要使用以前构建的OTP应用程序(我们称之为X)的系统。例如,如果我想构建一个新的OTP应用程序/模块,如何使用模块中已经存在的应用程序

我假设我可以调用
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处理得好很多。