You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用erl -pa运行编译后的rebar3 Erlang应用遇错求助

问题:手动启动依赖Cowboy的Erlang OTP应用失败

我有一个依赖Cowboy的Erlang OTP应用nerlnetApp,在应用目录执行rebar3 shell可以正常编译并运行,但CI环境无法使用Erlang shell,改用以下命令启动:

erl -pa jsx/ebin ranch/ebin cowlib/ebin cowboy/ebin nerlnetApp/ebin -eval "nerlnetApp_app:start(a,b)."

启动后出现如下错误:

{"init terminating in do_boot",
{noproc,{gen_server,call,[ranch_sup,{start_child,{{ranch_listener_sup,nerlnetInitiator},
{ranch_listener_sup,start_link,[nerlnetInitiator,ranch_tcp,#{connection_type=>supervisor,socket_opts=>[{port,8484}]},cowboy_clear,#{connection_type=>supervisor,env=>#{dispatch=>[{'_',[],[{[<<"updateJsonPath">>],[],jsonHandler,[<0.9.0>]},{[<<"isNerlnetDevice">>],[],iotHandler,[<0.9.0>]}]}]}}]},permanent,infinity,supervisor,[ranch_listener_sup]}},infinity]}}


问题原因

报错里的noproc是核心问题:调用gen_server:call(ranch_sup, ...)时,ranch_sup这个Ranch的根监督进程还没启动。rebar3 shell会自动按照OTP应用的依赖顺序,启动所有依赖的应用(比如Ranch、Cowboy、jsx),但直接用erl命令时,只是把这些应用的ebin路径添加到代码路径,并没有启动这些依赖应用。

解决方法

  1. 自动启动所有依赖
    把启动命令改成用application:ensure_all_started/1,它会递归启动目标应用的所有依赖,不用手动逐个启动:

    erl -pa jsx/ebin ranch/ebin cowlib/ebin cowboy/ebin nerlnetApp/ebin \
        -eval "application:ensure_all_started(nerlnetApp)."
    
  2. 确认应用依赖配置
    检查应用的.app文件(编译后在nerlnetApp/ebin下),确保applications字段包含了所有依赖(ranch、cowboy、jsx等)。正常情况下,rebar.config里的deps配置会自动生成到.app文件中,但如果有自定义修改,要确认配置正确。

  3. CI环境推荐方案
    用Rebar3生成发布包更稳定,避免手动管理路径和依赖:

    # 在应用目录执行
    rebar3 release
    # 启动应用
    _build/default/rel/nerlnetApp/bin/nerlnetApp start
    

    生成的发布包包含所有依赖和启动脚本,CI环境直接调用脚本即可,不用复杂的erl命令。


内容的提问来源于stack exchange,提问作者ddleon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:51:25