我們寫完一組功能模組後(在erlang中,以module為單位),總是希望這一組模組,可以打包成一個應用,作為一個單獨的整個,可以啟動,停止,象 mnesia一樣。並可以在其它應用中引用。如何來做到這一點呢。每一個應用都是通過application:start系列函數來啟動,application:stop可以停止一個應用。
一個應用需要一個.app檔案來描述,主要描述它包括哪些檔案,參數等。
如果在啟動erlang的VM時就啟動一個應用呢,實際上,我們是沒有辦法通過VM的參數來直接啟動一個自訂應用,有些參數如:start_sasl可以啟動一些內部的標準的build-in應用,但是我們可以給VM一個執行入口,這就象C語言或是java語言的main函數一樣,VM啟動時,執行這個程式的進入點,這樣就可以在這個入口中執行啟動應用的操作。
這個進入點通過參數-s 來指定。下面我們來看一個例子:
1. erl -s erlycomet_demo
這個參數指定,VM啟動後,調用erlycomet_demo:start()無參函數
2. 在erlycomet_demo:start()函數中,我們寫如下代碼:
application:start(erlycomet_demo).
上面這句話,啟動一個erlycomet_demo的應用,這裡,VM就會在搜尋目錄中找到erlycomet_demo.app這個檔案,如果不到,報錯,如果找到,則按這個檔案中的指示,啟動erlycomet_demo應用。這一部分可以參看相關的文檔,簡單的,在erlycomet_demo中一搬有一個參數{mod,{mod_name_app,[]}}
這個參數指示,調用mod_name_app:start(_type,Argu)這個函數。以erlycomet_demo為例,這個調用進入到erlycomet_demo_app:start(_type,Argu)中,
3. 在erlycomet_demo_app的start(_type,Argu)中,啟動 一個supervisor進程,進而啟動子進程。如下所示:
erlycomet_demo_sup:start_link(Args).
瞭解了,我們是通過application為單位來打包應用的,那麼我們如何才能共用應用呢??比如,我們如何在應用A中使用應用2的功能呢??答應是:以應用為單位來進行引用,例如:我們要便用mnesia功能,我就就調用mnesia:start()或是在應用A的application中指定,要啟動 mnesia。 在OPT中,有很多應用都是相互獨立,而又相互引用的。比如:mnesia, crpyto,inet 等。