我可以在另一个应用程序或模块中使用现有的OTP应用程序吗



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

我假设我可以调用start,因为它遵循application的行为,所以我构建了一个具有以下代码的极简主义应用程序Y:

y.erl:

-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.

Rebar成功编译了此代码,并且没有生成任何警告
rel/y/bin/y start根本不输出(我希望至少得到一个io:format的输出)rel/y/bin/y stop输出Node is not running!

您需要在应用程序的.app资源文件中将应用程序x列为从属应用程序,或者由于您正在使用rebar,因此需要在.app.src文件中列出:

{application, your_app,
 [{description,"your application"},
  {vsn, "0.1"},
  {modules,[]},
  {registered, []},
  {mod,{your_app,[]}},
  {env, []},
  {applications,[kernel, stdlib, x]}]}.

请注意,在最后一行中,x被列为应用程序依赖项。这导致Erlang应用程序控制器确保x在启动应用程序之前启动。如果您通过application:ensure_all_started/1,2在Erlang shell中以交互方式启动应用程序,则此声明将确保在应用程序启动之前先启动x

最新更新