当前位置: 首页 > news >正文

Erlang 使用escript打包多个模块构建一个可执行文件

概念

主模块:作为二进程程序(打包后的文件)的入口模块,需要定义main/1 函数并导出
打包函数(逻辑):示例代码中的hello:build/0
非rebar3 方式打包,直接源码操作。

简单说明

把 a.erl/b.erl 模块打包成一个 可执行文件a或b (只能是打包模块中的文件名)。

在linux可直接执行得到的二进制文件。

在windows下需要使用 escript a 执行 或者 使用bat脚本二次封装。

原理

利用escript提供的功能来完成,具体可看官方文档
主要是escript:create/2 函数。

注意事项

  • 如果打包的模块在打包执行环境中没有beam文件,那就可以用代码编译,再获取beam code
  • 如果打包的模块在打包执行环境中有beam文件,且能成功加载,可使用code:get_object_code 来获取

打包函数可以单独放一个escript脚本,也可以放在打包模块中去,特殊处理一下入口即可。

escript:create(Name)

Name是执行文件的主模块,需要有main函数,如果Name是字符串,则直接创建文件。
举例说明一下,比如Name是"hello",那么会生成 一个"hello"文件,并且打包的文件中要有hello模块,且有hello:main/1,导出。

其他方式

可使用rebar3 来构建可执行程序。

代码示例

escript 或 erl 脚本
hello.escript/hello.erl 都可以

-doc"""构建一个可执行文件 直接执行
""".
-module(hello).
-mode(compile).
-export([main/1]).main(_) ->build().build() ->io:format("=======================================================~n"),io:format("开始打包...~n"),Self = escript:script_name(),Name = ?MODULE_STRING,F = fun(?MODULE, Acc) ->%% escript 脚本作为主模块,需要通过手动编译的方式拿到object code{ok, _, CodeBin} = compile:file(Self, [binary]),FileName = ?MODULE_STRING ++ ".beam",io:format("pack ~p~n", [FileName]),[{FileName, CodeBin} | Acc];(Module, Acc) ->{_, CodeBin, FileName} = code:get_object_code(Module),io:format("pack ~p~n", [FileName]),[{filename:basename(FileName), CodeBin} | Acc]end,Files = lists:foldl(F, [], [?MODULE, module_a,module_b]),R = escript:create(Name, [shebang,{archive, Files, []}]),case R ofok ->{ok, CWD} = file:get_cwd(),io:format("[OO] 打包完成:~p ~n", [filename:join([CWD, Name])]),ok;Error ->io:format("[XX] 打包失败:~p ~n", [Error]),Errorend,ok.
http://www.jsqmd.com/news/339130/

相关文章:

  • AI产品经理:大模型时代最有“钱“景的岗位,零基础入门到实战全攻略_想转行AI产品经理,90%的人第一步就走错了!
  • 计算机毕业设计springboot飞机票预订系统 基于Spring Boot的航空票务服务平台设计与实现 基于Java Web的民航订票管理系统开发
  • IS420UCSBH4A 产品概述
  • 收藏!AI工程师的两大方向:传统算法VS大模型应用,小白如何抓住AI风口?_传统算法vs大模型应用开发工程师
  • 京东e卡回收参考价格,市场行情与核心数据全解析 - 京顺回收
  • 2025年SEVC SCI2区,结合低差异序列和共轭梯度法的新型异构综合学习粒子群算法,深度解析+性能实测
  • 科技普惠基层,AI肝胆超级医生让优质诊疗服务下沉
  • 妙啊!浙大学者评估动态虚弱轨迹,四库联合登上一区Top(IF 13) | 公共数据库好文汇总
  • 跨境电商营销策略
  • 纳米抗体(VHH):特性优异的新型抗体工具 多领域临床应用潜力显著
  • 芯片产业链全景透视:从EDA到终端,拆解万亿赛道核心壁垒
  • 利用LLM+RAG实现知识图谱自动更新:小白也能上手的AI实战指南
  • 大语言模型在智能风险管理中的推理应用探索
  • 拥抱AI最好的方式:带着兄弟们部署一个OpenClaw,24小时智能助手Get!
  • PDF解析+大模型=翻车?手把手教你构建可靠的知识库系统,建议收藏!
  • Snowflake投资2亿美元引入OpenAI模型提升数据库对话能力
  • 没想到,Momenta单月智驾搭载量近9万了......
  • 【报告】广东鸿图泰国建厂:一次围绕履约半径与组织边界的出海尝试
  • RabbitMQ在大数据领域的实时数据处理架构
  • OpenClaw修复一键远程代码执行漏洞,安全漏洞层出不穷
  • 上交自动驾驶3D重建综述!从NeRF到3DGS的全面调研(T-ITS‘25)
  • 山东道恩高分子材料在越南买下的,不只是一个工厂
  • Pandas 常用函数
  • Software Development Process Project Management 2
  • Oracle数据库26ai首个通用版引质疑
  • 26年已经跑了九家前端面试,基本全过了
  • 嵌入式基础——上拉电阻与下拉电阻
  • 基于深度确定性策略梯度算法(DDPG)进行滑模控制(SMC)调参优化算法DDPG_SMC(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • AI原生应用领域中AI代理的动态调整策略
  • 电力系统优化调度方向求解器/启发式优化算法(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码