2013-05-21 53 views
11

我是Erlang世界的新手,目前無法弄清楚如何啓動我的虛擬erlang應用程序。可能,我只是錯過了一些東西...所以,我創建了一個應用程序與螺紋鋼(鋼筋創建應用程序appid = dummys)。如何運行erlang(螺紋鋼構建)應用程序

目前我有

  • rebar.config
  • 的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與erro碰撞R.,

如果我嘗試

erl -noshell -pa ebin -s dummys_app start 

它輸出只是 「啓動應用程序(DEV)..」,這一切。但我也希望看到「正在啓動應用程序..

我失蹤或做錯了什麼?

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

而另一個問題:如何正確地將新的模塊添加到我的虛擬應用程序?例如,我有一個名爲「* dummys_cool *」的附加模塊,它有一個「start」方法。如何告訴我的應用程序運行該「dummys_cool#start」方法?

謝謝!

回答

12

爲了快速發展,如果你只是想確保你的機應用可以啓動,啓動一個shell,然後啓動應用程序:

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

這會給你的什麼是錯的乾淨的指示,右無炮彈轟炸後。

由於您正在創建一個應用程序來運行,而不僅僅是一個庫來共享,您將需要發佈一個版本。鋼筋可以讓你最那裏的方式:

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 
+0

謝謝你解釋!最後,我想出了它如何一起工作。 – cyrillk

+0

這是可靠的建議。看來,rebar3的語義已經發生了一些變化。文檔很棒(https://www.rebar3.org/docs/releases)。具體檢查一下{dev_mode,true}。 –

2

看看你的dummys.app.src文件。所有指令的含義在the 'app' manpage中解釋,但我懷疑這裏缺少的是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]}]}. 

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

+0

謝謝@legoscia。我檢查了我的app.src文件和MOD是有 '{應用,dummys, [ {介紹, 「虛擬應用程序」},{ VSN, 「1」},{ 註冊,[]}, {應用[ 內核, STDLIB ]},{ 國防部,{dummys_app,[]}},{ ENV,[]} ]}。' – cyrillk

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

上面的代碼將無法工作,因爲application:start([dummys])將被調用。

有關詳細信息,您可以參考Erlang documentation

對於你的情況,

erl -noshell -pa ebin -s dummys