我正在构建一个需要使用以前构建的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!
答案 0 :(得分:3)
您需要在x
中列出应用rebar
作为相关应用,或者在.app.src
文件中使用{application, your_app,
[{description,"your application"},
{vsn, "0.1"},
{modules,[]},
{registered, []},
{mod,{your_app,[]}},
{env, []},
{applications,[kernel, stdlib, x]}]}.
后列出
x
请注意,最后一行x
被列为应用程序依赖项。这导致Erlang应用程序控制器确保在启动应用程序之前启动x
。如果您通过application's .app
resource file在Erlang shell中以交互方式启动应用程序,则此声明将确保在应用程序启动之前首先启动titles = ['Title: Sub', 'Title Sub', 'Title - Sub']
s = ': -'
if titles[1].translate(None, s) == titles[2].translate(None, s):
match = 'True'
else
match = 'False'
。