erlang.mk淺析

背景:

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


makefile內(nèi)容.png

而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的源碼如圖所示。


運(yùn)行make run的作用.png

erlang.mk對(duì)于啟動(dòng)release的源碼.png

這時(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構(gòu)建release源碼.png
erlang.mk源碼對(duì)于rel-deps的實(shí)現(xiàn).png
relx描述.png
erlang.mk對(duì)erl進(jìn)行編譯的源碼.png

erlang.mk生成app元數(shù)據(jù).png

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

erlang.mk導(dǎo)入依賴的源碼1.png

erlang.mk導(dǎo)入依賴的源碼2.png

erlang.mk導(dǎo)入依賴的源碼3.png

依賴樹的前序遍歷來解決沖突.png

PS:

  • 附上erlang.mk 編譯運(yùn)行example后的內(nèi)容。
image.png

image.png

image.png

image.png

自己手動(dòng)執(zhí)行release的效果是和run的效果等同.png
  • 附上relx構(gòu)建release的過程:
relx構(gòu)建release的入口.png

先將各app放入lib文件夾下.png

根據(jù)生成rel.png

ec_file:write_term(ReleaseFile,Meta).png
根據(jù)rel去生成script和boot.png
rel文件內(nèi)容信息的由來1.png

rel文件內(nèi)容信息的由來2.png

傳統(tǒng)方法構(gòu)建release流程:

  1. 確定需要包含的application,將其放入lib。
  2. 編寫rel文件(內(nèi)容包括鏡像名稱,erts版本以及release中所有應(yīng)用名稱和版本)
  3. 將所有準(zhǔn)備納入release的application加入代碼路徑,使用systools去生成script和boot。
  4. 編寫sys.config(可選,比如里面可以聲明sasl日志的輸出位置)。
  5. 這時(shí)候就可以使用該release了,只是需要在啟動(dòng)時(shí)指定boot和sys.conf

erlang.mk和relx構(gòu)建release流程:

  1. erl->beam (編譯,依賴導(dǎo)入,依賴沖突處理),這部分是erlang.mk去處理,它將依賴下載后放入deps文件夾,并編譯src的代碼,生成app,一并放入ebin
  2. erlang.mk把構(gòu)建release工作委托給relx。
  3. relx只要有beam和relx.conf就可以去構(gòu)建release。
    a. 把各app放入lib。
    b. 產(chǎn)生rel文件。
    c. 通過rel來使用systools去生成script和boot。bin/安裝腳本。bin/啟動(dòng)腳本
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評(píng)論 19 139
  • 用到的組件 1、通過CocoaPods安裝 2、第三方類庫安裝 3、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 15,164評(píng)論 1 180
  • Julia君閱讀 469評(píng)論 0 1
  • 照例,歲末年初要對(duì)過去的一年進(jìn)行回顧反思,對(duì)未來一年進(jìn)行規(guī)劃。所幸的是,這不是組織方排,可以比較隨便地想、自...
    學(xué)者茶館閱讀 625評(píng)論 1 0
  • 我們?cè)陂_發(fā)程序之前都需要相應(yīng)的環(huán)境,對(duì)于開發(fā)環(huán)境的搭建可能會(huì)看到不同的教程,雖說都是大同小異,但稍不注意就會(huì)出...
    gcter閱讀 3,635評(píng)論 0 0

友情鏈接更多精彩內(nèi)容