我可以在另一个应用程序或模块中使用现有的 OTP 应用程序吗?
Can I use an existing OTP application inside another application or module?
我正在构建一个需要使用以前构建的 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!
您需要在 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
在您的应用程序启动之前首先启动。
我正在构建一个需要使用以前构建的 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!
您需要在 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
在您的应用程序启动之前首先启动。