背景:
在學(xué)習(xí)ranch的時(shí)候,肯定是先去跑下官方給的demo了。跟著官方給的指示,在centos上只需要make run即可將這個(gè)demo運(yùn)行起來。而我去看該demo的makefile文件,只是簡(jiǎn)短的幾行,除了項(xiàng)目名和依賴外,就是他有include一個(gè)erlang.mk的東西。

而erlang.mk這個(gè)文件有200k的大小,也是和ranch同一個(gè)團(tuán)隊(duì)做出來的一個(gè)構(gòu)建工具。
我一開始只是想要在不依賴這個(gè)構(gòu)建工具的情況下去導(dǎo)入ranch依賴并且將自己寫的ranch demo跑起來,但是遇到了一個(gè)ranch前置依賴ssl沒有start的問題,在請(qǐng)教思強(qiáng)之后,我知道了原來是要將這些erlang內(nèi)置的application都start起來,然后再start ranch,再start自己的ranch demo。就此,也是將自己項(xiàng)目在不使用erlang.mk的情況下跑起來了。
問題:
當(dāng)然也是有一個(gè)問題,為什么erlang.mk 可以直接make run就可以將系統(tǒng)跑起來,還不需要將ranch的依賴啟動(dòng),再啟動(dòng)ranch,再啟動(dòng)自己的項(xiàng)目,erlang.mk是做了哪些操作才讓項(xiàng)目的運(yùn)行如此方便的呢?(其實(shí)是思強(qiáng)的疑問,然后引導(dǎo)我去做的。)抱著這個(gè)疑問,我閱讀了相關(guān)資料,如傳統(tǒng)方式去構(gòu)建發(fā)布安裝release,erlang.mk官方文檔,erlang.mk源碼。
解決:
首先從官網(wǎng)文檔上有這樣的描述:erlang.mk在你執(zhí)行make run時(shí)會(huì)編譯項(xiàng)目和構(gòu)建一個(gè)release,然后再去啟動(dòng)已發(fā)布的release。而其中的啟動(dòng)release是對(duì)應(yīng)Exec:xxxxx這行,并且erlang.mk對(duì)于啟動(dòng)release的源碼如圖所示。


這時(shí)候我們知道他之所以不需要自己去手動(dòng)一個(gè)一個(gè)start application是因?yàn)樵趓un的時(shí)候是直接啟動(dòng)一個(gè)已發(fā)布的release。那么以erlang/otp提供給我們的方式去構(gòu)建運(yùn)行一個(gè)release的情況是怎么實(shí)現(xiàn)的呢?這部分內(nèi)容在erlang man上可以看到 http://erlang.org/doc/man/rel.html
但是官網(wǎng)man上對(duì)其的描述很少,我也有去參考了一些erlang的書籍,可得到結(jié)論如下:release的rel文件和script文件描述了系統(tǒng)的啟動(dòng)過程,其中script文件內(nèi)包含一個(gè)完整的規(guī)范,所有應(yīng)用的內(nèi)容明細(xì)都全部羅列在內(nèi),包括應(yīng)用的路徑,需要加載的模塊以及其他各種必要的信息。而boot文件是script文件的二進(jìn)制形式??晒〆rts在啟動(dòng)時(shí)直接讀取。這就是為什么直接make run(即直接啟動(dòng)一個(gè)release)可以將項(xiàng)目跑起來而不需要一個(gè)一個(gè)的去start application的原因。
PS:在otp design_principles上面有對(duì)其release詳細(xì)的內(nèi)容。http://erlang.org/doc/design_principles/release_structure.html
而在erlang.mk文檔中可知,erlang.mk對(duì)于構(gòu)建release的工作不是在erlang.mk實(shí)現(xiàn)的,而是去委托給relx去做這個(gè)構(gòu)建工作。
https://github.com/erlware/relx





erlang.mk github上對(duì)這部分有進(jìn)行分離出來。除了表明erlang.mk是如何編譯erl文件的同時(shí),該文件上面部分也展示了如何導(dǎo)入依賴問題和解決依賴沖突問題。
https://github.com/ninenines/erlang.mk/blob/master/core/erlc.mk




PS:
- 附上erlang.mk 編譯運(yùn)行example后的內(nèi)容。





- 附上relx構(gòu)建release的過程:







傳統(tǒng)方法構(gòu)建release流程:
- 確定需要包含的application,將其放入lib。
- 編寫rel文件(內(nèi)容包括鏡像名稱,erts版本以及release中所有應(yīng)用名稱和版本)
- 將所有準(zhǔn)備納入release的application加入代碼路徑,使用systools去生成script和boot。
- 編寫sys.config(可選,比如里面可以聲明sasl日志的輸出位置)。
- 這時(shí)候就可以使用該release了,只是需要在啟動(dòng)時(shí)指定boot和sys.conf
erlang.mk和relx構(gòu)建release流程:
- erl->beam (編譯,依賴導(dǎo)入,依賴沖突處理),這部分是erlang.mk去處理,它將依賴下載后放入deps文件夾,并編譯src的代碼,生成app,一并放入ebin
- erlang.mk把構(gòu)建release工作委托給relx。
- relx只要有beam和relx.conf就可以去構(gòu)建release。
a. 把各app放入lib。
b. 產(chǎn)生rel文件。
c. 通過rel來使用systools去生成script和boot。bin/安裝腳本。bin/啟動(dòng)腳本