设置base_dir后,rebar3构建OTP release出现找不到目标及源码问题
Rebar3构建OTP Release时的源码缺失与依赖问题
问题现象
使用rebar3构建OTP Release时,配置{base_dir, }选项后,执行rebar3 release命令出现两类问题:一是提示大量未定义函数调用,二是抛出找不到源码文件的警告,具体输出如下:
===> 校验依赖... ===> 分析应用... ===> 编译nerlnetApp ===> 组装发布包nerlnet_core-1.2.2... ===> 发布包中存在缺失的函数调用。 ===> 确保运行时所需的所有应用都已包含在发布包中。 ===> clientStatem:init/1 调用了未定义函数 inets:start/0 ===> mainGenserver:init/1 调用了未定义函数 inets:start/0 ===> nerlNetStatem:wait/3 调用了未定义函数 nerlNIF:call_to_get_weights/1 ===> nerlNetStatem:wait/3 调用了未定义函数 nerlNIF:call_to_set_weights/3 ===> nerl_tools:http_request/4 调用了未定义函数 httpc:request/4 ===> nerl_tools:http_request/4 调用了未定义函数 httpc:set_options/1 ===> nerlnetApp_app:parseJsonAndStartNerlnet/1 调用了未定义函数 jsx:decode/2 ===> routerGenserver:init/1 调用了未定义函数 inets:start/0 ===> sourceStatem:init/1 调用了未定义函数 inets:start/0 ===> 生成发布包时的警告: *WARNING* 缺失应用sasl。无法使用此发布包进行版本升级 *WARNING* public_key: 未找到源码文件: 'OTP-PUB-KEY'.erl *WARNING* public_key: 未找到源码文件: 'PKCS-FRAME'.erl *WARNING* nerlnetApp: 未找到源码文件: ackHandler.erl *WARNING* nerlnetApp: 未找到源码文件: actionHandler.erl *WARNING* nerlnetApp: 未找到源码文件: castingHandler.erl *WARNING* nerlnetApp: 未找到源码文件: clientStateHandler.erl *WARNING* nerlnetApp: 未找到源码文件: clientStatem.erl *WARNING* nerlnetApp: 未找到源码文件: guiHandler.erl *WARNING* nerlnetApp: 未找到源码文件: initHandler.erl *WARNING* nerlnetApp: 未找到源码文件: iotHandler.erl *WARNING* nerlnetApp: 未找到源码文件: jsonHandler.erl *WARNING* nerlnetApp: 未找到源码文件: jsonParser.erl *WARNING* nerlnetApp: 未找到源码文件: mainGenserver.erl *WARNING* nerlnetApp: 未找到源码文件: nerl.erl *WARNING* nerlnetApp: 未找到源码文件: nerlNIF.erl *WARNING* nerlnetApp: 未找到源码文件: nerlNetStatem.erl *WARNING* nerlnetApp: 未找到源码文件: nerlTests.erl *WARNING* nerlnetApp: 未找到源码文件: noMatchingRouteHandler.erl *WARNING* nerlnetApp: 未找到源码文件: parser.erl *WARNING* nerlnetApp: 未找到源码文件: passHandler.erl *WARNING* nerlnetApp: 未找到源码文件: routerGenserver.erl *WARNING* nerlnetApp: 未找到源码文件: routingHandler.erl *WARNING* nerlnetApp: 未找到源码文件: sourceStatem.erl *WARNING* nerlnetApp: 未找到源码文件: workerFederatedClient.erl *WARNING* nerlnetApp: 未找到源码文件: workerFederatedServer.erl *WARNING* nerlnetApp: 未找到源码文件: workerGeneric.erl *WARNING* nerlnetApp: 未找到源码文件: workerNN.erl
解决方案
1. 修复源码文件找不到的问题
{base_dir, }配置会改变rebar3的工作目录结构,导致源码定位失败:
- 检查
rebar.config中的src_dirs配置,确保所有存放.erl文件的目录都被包含,例如:{src_dirs, ["src", "src/handlers", "src/gen_servers"]} - 确认
base_dir的路径配置正确,优先使用绝对路径;若用相对路径,确保是基于项目根目录的相对路径
2. 解决未定义函数调用问题
这些错误是因为发布包中缺少依赖的应用或模块:
- OTP自带应用(inets/httpc):在
rebar.config的relx段添加{apps, [inets]},或者在应用的.app.src文件中把inets加入applications列表 - 第三方依赖(jsx):确认
rebar.config的deps中已声明jsx(例如{jsx, "~> 3.0"}),并执行rebar3 get-deps安装依赖 - 自定义NIF模块(nerlNIF):检查
rebar.config中的NIF编译配置,确保编译规则正确,且编译生成的.so/.dll文件被正确打包进发布包
3. 处理SASL缺失警告
若需要支持版本升级,在relx配置的apps列表中加入sasl:
{relx, [ {release, {nerlnet_core, "1.2.2"}, [ sasl, nerlnetApp ]} ]}.
内容的提问来源于stack exchange,提问作者ddleon
相关产品推荐
相关产品推荐

