【问题标题】:Can I use an existing OTP application inside another application or module?我可以在另一个应用程序或模块中使用现有的 OTP 应用程序吗?
【发布时间】:2016-07-15 01:53:29
【问题描述】:

我正在构建一个系统,该系统需要使用以前构建的 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!

【问题讨论】:

    标签: erlang erlang-otp erlang-shell


    【解决方案1】:

    您需要在您的application's .app resource file 中将应用程序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

    【讨论】:

    • 非常感谢您的回答。所以这意味着如果我在正确配置x.app.src 之后使用application:start(y).,我会看到预期的结果吗?我可能应该放弃x_app:start([]). 行?
    • 正确,您不应该像所示的那样从自己的代码启动应用程序。如果y 依赖于x,请在y.app.src 中列出x,就像我展示的那样,正常的Erlang 发布启动机制将确保它们以正确的顺序启动。
    • 停止应用程序怎么样?调用application:stop(y). 也会终止x 吗?
    • 运行 application:stop(y) 只会停止应用程序 y。但是,如果您正在运行一个版本,关闭节点将按照与启动顺序相反的顺序停止所有应用程序。至于rebar generate的错误,也许这个问题会有所帮助:stackoverflow.com/q/10476790/409228
    • 这里有 rebar wiki:github.com/rebar/rebar/wiki/Release-handling,另请参阅此问题:stackoverflow.com/q/17482732/409228,您也可以考虑切换到 rebar3,因为它比 rebar 处理发布要好得多。跨度>
    猜你喜欢
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2021-11-09
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多