which erl 在 vscode 终端里必须返回路径,否则所有 erlang 功能静默失效;需通过 code . 启动或配置 shell 环境确保 path 继承,并显式设置 erlang.erlpath 和 erlang.rebar3path 的绝对路径。

which erl 在 VSCode 终端里必须返回路径
BEAM 节点连接失败的根源,90% 都卡在这一步:VSCode 内置终端压根调不动 erl。语言服务器、调试器、rebar3 任务全依赖它启动节点,which erl 返回空或 command not found,后续所有配置都是徒劳。
常见陷阱:
- 从桌面图标启动 VSCode → 拿的是系统登录时的 PATH,不包含你
~/.zshrc里加的 Erlang bin 路径 - Windows 上
erl.exe路径含中文或空格 → BEAM 启动静默失败,错误只埋在erlang-ls日志里,终端看不到 - 用
asdf管理版本 → 忘了运行asdf reshim erlang,which erl找不到软链接目标
修复只有一条路:让 VSCode 继承正确的 PATH。要么在已配好环境的终端里执行 code . 启动;要么把 Erlang bin 目录写进 shell 配置(~/.zshrc 或系统环境变量),然后完全退出 VSCode 再重启。
erlang.erlPath 和 erlang.rebar3Path 必须填绝对路径
即使 which erl 有输出,erlang-ls 语言服务器也默认忽略系统 PATH,它只认你在 VSCode 设置里显式填的两个路径——而且必须是真实可执行文件的绝对路径。
务必检查:
-
erlang.erlPath→ 填/usr/local/lib/erlang/bin/erl(macOS/Linux)或C:\Program Files\erl-25.3\bin\erl.exe(Windows),不能是软链接,不能是erl.bat -
erlang.rebar3Path→ 填/home/you/.local/bin/rebar3这类真实可执行文件路径,不是rebar3.bat,也不是符号链接本身
改完设置后必须彻底重启 VSCode,语言服务器不会热重载。验证方式:打开任意 .erl 文件,右下角状态栏出现 erlang-ls: ready 才算生效。
launch.json 中 node name 和 cookie 必须与目标节点一致
VSCode 调试器本质是 attach 到一个已运行的 BEAM 节点,而不是自己拉起新节点。如果 launch.json 里写的 node 名或 cookie 和你要连的节点不匹配,就会报 connection refused 或卡在 waiting for node。
实操要点:
- 手动启动节点时,必须带
-name(分布式)或-sname(短名)和-setcookie参数,例如:erl -name myapp@127.0.0.1 -setcookie abc123 -
launch.json的request类型必须为attach,且name和cookie字段要和上面命令严格一致 - 若用
rebar3 shell启动,它默认用-sname,节点名是随机的(如rebar3@DESKTOP),此时应改用rebar3 as dev shell --name myapp@127.0.0.1 --setcookie abc123显式控制
注意:同一台机器上多个节点的 cookie 必须相同,否则无法通信;name 必须唯一,且 DNS 可解析(127.0.0.1 是最稳妥的本地 fallback)。
调试前 application:ensure_all_started/1 必须手动跑通
VSCode 调试器不会帮你拉起依赖应用。如果你的 launch.json 配了 "startFun": "application:start",但项目依赖 cowboy 而它没 start,调试器会直接报 {error,{not_started,cowboy}} 并退出,断点根本设不上。
必须前置验证:
- 在 VSCode 终端中进入项目根目录,运行
rebar3 shell - 在 shell 里执行
application:ensure_all_started(myapp).,确认返回ok - 检查
myapp.app.src的applications列表是否完整,rebar.config是否声明了所有 deps - 只有这一步通过,再配
launch.json才有意义
最容易被跳过的其实是 crypto 应用:如果 erl -eval 'crypto:start(). halt().' -noshell 报 undefined function crypto:start/0,说明 OTP 安装不完整,得重装或手动启用——这个细节藏得深,但会让整个节点启动链断裂。











