erlang.mk浅析

背景:

在学习ranch的时候,肯定是先去跑下官方给的demo了。跟着官方给的指示,在centos上只需要make run即可将这个demo运行起来。而我去看该demo的makefile文件,只是简短的几行,除了项目名和依赖外,就是他有include一个erlang.mk的东西。


makefile内容.png

而erlang.mk这个文件有200k的大小,也是和ranch同一个团队做出来的一个构建工具。
我一开始只是想要在不依赖这个构建工具的情况下去导入ranch依赖并且将自己写的ranch demo跑起来,但是遇到了一个ranch前置依赖ssl没有start的问题,在请教思强之后,我知道了原来是要将这些erlang内置的application都start起来,然后再start ranch,再start自己的ranch demo。就此,也是将自己项目在不使用erlang.mk的情况下跑起来了。

问题:

当然也是有一个问题,为什么erlang.mk 可以直接make run就可以将系统跑起来,还不需要将ranch的依赖启动,再启动ranch,再启动自己的项目,erlang.mk是做了哪些操作才让项目的运行如此方便的呢?(其实是思强的疑问,然后引导我去做的。)抱着这个疑问,我阅读了相关资料,如传统方式去构建发布安装release,erlang.mk官方文档,erlang.mk源码。

解决:

首先从官网文档上有这样的描述:erlang.mk在你执行make run时会编译项目和构建一个release,然后再去启动已发布的release。而其中的启动release是对应Exec:xxxxx这行,并且erlang.mk对于启动release的源码如图所示。


运行make run的作用.png

erlang.mk对于启动release的源码.png

这时候我们知道他之所以不需要自己去手动一个一个start application是因为在run的时候是直接启动一个已发布的release。那么以erlang/otp提供给我们的方式去构建运行一个release的情况是怎么实现的呢?这部分内容在erlang man上可以看到 http://erlang.org/doc/man/rel.html
但是官网man上对其的描述很少,我也有去参考了一些erlang的书籍,可得到结论如下:release的rel文件和script文件描述了系统的启动过程,其中script文件内包含一个完整的规范,所有应用的内容明细都全部罗列在内,包括应用的路径,需要加载的模块以及其他各种必要的信息。而boot文件是script文件的二进制形式。可供erts在启动时直接读取。这就是为什么直接make run(即直接启动一个release)可以将项目跑起来而不需要一个一个的去start application的原因。

PS:在otp design_principles上面有对其release详细的内容。http://erlang.org/doc/design_principles/release_structure.html

而在erlang.mk文档中可知,erlang.mk对于构建release的工作不是在erlang.mk实现的,而是去委托给relx去做这个构建工作。
https://github.com/erlware/relx

erlang.mk构建release源码.png
erlang.mk源码对于rel-deps的实现.png
relx描述.png
erlang.mk对erl进行编译的源码.png

erlang.mk生成app元数据.png

erlang.mk github上对这部分有进行分离出来。除了表明erlang.mk是如何编译erl文件的同时,该文件上面部分也展示了如何导入依赖问题和解决依赖冲突问题。
https://github.com/ninenines/erlang.mk/blob/master/core/erlc.mk

erlang.mk导入依赖的源码1.png

erlang.mk导入依赖的源码2.png

erlang.mk导入依赖的源码3.png

依赖树的前序遍历来解决冲突.png

PS:

  • 附上erlang.mk 编译运行example后的内容。
image.png

image.png

image.png

image.png

自己手动执行release的效果是和run的效果等同.png
  • 附上relx构建release的过程:
relx构建release的入口.png

先将各app放入lib文件夹下.png

根据生成rel.png

ec_file:write_term(ReleaseFile,Meta).png
根据rel去生成script和boot.png
rel文件内容信息的由来1.png

rel文件内容信息的由来2.png

传统方法构建release流程:

  1. 确定需要包含的application,将其放入lib。
  2. 编写rel文件(内容包括镜像名称,erts版本以及release中所有应用名称和版本)
  3. 将所有准备纳入release的application加入代码路径,使用systools去生成script和boot。
  4. 编写sys.config(可选,比如里面可以声明sasl日志的输出位置)。
  5. 这时候就可以使用该release了,只是需要在启动时指定boot和sys.conf

erlang.mk和relx构建release流程:

  1. erl->beam (编译,依赖导入,依赖冲突处理),这部分是erlang.mk去处理,它将依赖下载后放入deps文件夹,并编译src的代码,生成app,一并放入ebin
  2. erlang.mk把构建release工作委托给relx。
  3. relx只要有beam和relx.conf就可以去构建release。
    a. 把各app放入lib。
    b. 产生rel文件。
    c. 通过rel来使用systools去生成script和boot。bin/安装脚本。bin/启动脚本
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,609评论 1 180
  • 照例,岁末年初要对过去的一年进行回顾反思,对未来一年进行规划。所幸的是,这不是组织方排,可以比较随便地想、自...
    学者茶馆阅读 572评论 1 0
  • 我们在开发程序之前都需要相应的环境,对于开发环境的搭建可能会看到不同的教程,虽说都是大同小异,但稍不注意就会出...
    gcter阅读 3,568评论 0 0