簡體   English   中英

如何運行erlang(鋼筋構建)應用程序

[英]How to run erlang (rebar build) application

我是 Erlang 世界的新手,目前不知道如何啟動我的虛擬 erlang 應用程序。 可能,我只是錯過了一些東西......所以,我用鋼筋創建了一個應用程序(rebar create-app appid=dummys)。

目前我有

  • 鋼筋配置
  • src/dummys.app.src
  • src/dummys_app.erl
  • src/dummys_sup.erl

我發現為了在開發過程中運行應用程序,最好創建一個額外的啟動方法,該方法應該調用 application:start(module)。

我在啟動方法中添加了一些基本的日志記錄。

start() ->
    error_logger:info_msg("Starting app(dev)..~n"),
    application:start(dummys_app).

start(_StartType, _StartArgs) ->
    error_logger:info_msg("Starting app..~n"),
    dummys_sup:start_link().

如果我嘗試

erl -noshell -pa ebin -s application start dummys
erl -noshell -pa ebin -s application start dummys_app

沒有輸出..

如果我嘗試

erl -noshell -pa ebin -s dummys start

erl 因錯誤而崩潰..

如果我嘗試

erl -noshell -pa ebin -s dummys_app start

它只輸出“正在啟動應用程序(開發)... ”,僅此而已。 但我也希望看到“正在啟動應用程序..

我錯過了什么或做錯了什么?

==============

還有一個問題:如何正確地向我的虛擬應用程序添加一個新模塊? 例如,我有一個名為“*dummys_cool*”的附加模塊,它有一個“ start ”方法。 如何告訴我的應用程序運行“dummys_cool#start”方法?

謝謝!

為了快速開發,如果您只是想確保您的應用程序可以啟動,請啟動一個 shell,然后啟動應用程序:

erl -pa ebin
1> dummys_app:start().

這會給你一個清晰的指示,知道什么是錯的,什么是對的,而不會被炮彈炸毀。

由於您正在制作一個要運行的應用程序,而不僅僅是一個要共享的庫,因此您需要發布一個版本。 Rebar 可以幫助您完成大部分工作:

mkdir rel
cd rel
rebar create-node nodeid=dummysnode

編譯應用程序后,您可以創建一個版本:

rebar generate

這將構建一個可移植的版本,其中包括所有必需的庫,甚至 erlang 運行時系統。 這默認放在 rel/ 目錄中; 在你的情況下 rel/dummys。

在該目錄中將有一個控制腳本,您可以使用它來啟動、停止和附加到應用程序:

rel/dummys/bin/dummys start
rel/dummys/bin/dummys stop
rel/dummys/bin/dummys start
rel/dummys/bin/dummys attach

看看你的dummys.app.src文件。 所有指令的含義在“app”手冊頁中都有解釋,但我懷疑這里缺少的是mod ,它表示您的應用程序回調模塊的名稱。 因此,請確保存在此行:

{mod, {dummys_app, []}}

那里的空列表將作為StartArgs參數傳遞給dummys_app:start/2


要使新模塊與您的應用程序一起啟動,請將其添加到dummys_sup:init的監督樹中。 這個函數應該類似於:

 init(_) -> {ok, {{one_for_one, 10, 10}, [{dummys_cool, {dummys_cool, start_link, []}, permanent, brutal_kill, worker, [dummys_cool]}]}.

這在'supervisor' manpage 中有描述,但基本上這意味着在啟動時,這個supervisor 將啟動一個子進程。 dummys_cool:start_link()將被調用,該函數預計會產生一個新進程,鏈接到它,並返回其進程 ID。 如果您需要更多進程,只需將更多子規范添加到列表中。

erl -noshell -pa ebin -s application start dummys

上面的代碼將不起作用,因為application:start([dummys])將被調用。

您可以參考Erlang 文檔了解詳細信息。

對於你的情況,

erl -noshell -pa ebin -s dummys

我遇到了這個問題,這是谷歌上的第一個答案。

如果您使用的是 rebar3,標准配置將有一個shell命令來編譯您的項目並打開一個 shell:

$ rebar3 shell
===> Analyzing applications...
===> Compiling myapp
Erlang/OTP 21 [erts-10.2.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1]

Eshell V10.2.4  (abort with ^G)
1> ===> Booted myapp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM