vscode内置终端中which erl返回空,说明path未正确继承,需通过code .启动或配置shell环境确保path生效,并显式设置erlang.erlpath和erlang.rebar3path为绝对路径,重启后验证erlang-ls: ready状态。

VSCode 本身不运行 Erlang 代码,所有“无法运行”问题,90% 都卡在 erl 命令根本没接上——不是插件装错了,是 VSCode 终端里连 which erl 都返回空。
VSCode 内置终端里 which erl 返回空怎么办
这是整个配置的起点,也是最常被跳过的验证步骤。插件(比如 pguyot.erlang)启动语言服务器前会先调用 erl;失败就静默退场,不报错、不提示,只留一堆灰色按钮。
- 按
Ctrl+`打开内置终端,执行which erl和which rebar3——任一为空或command not found,立刻停手,别配launch.json或改插件设置 - 常见原因:
• 从桌面图标启动 VSCode → 它拿的是系统登录时的PATH,不包含你~/.zshrc里加的 Erlang 路径
• Windows 上erl.exe路径含中文或空格 → BEAM 启动失败,但错误只埋在语言服务器日志里
• 用asdf管理版本 → 忘了运行asdf reshim erlang,which erl找不到软链接目标 - 修复方式只有一条:让 VSCode 继承正确的
PATH
• 推荐:在已配置好环境的终端中执行code .启动 VSCode
• 备选:把 Erlangbin目录写进~/.zshrc(macOS/Linux)或系统环境变量(Windows),然后**完全退出 VSCode 再重启**
erlang.erlPath 和 erlang.rebar3Path 必须填绝对路径
即使 which erl 有输出,erlang-ls 语言服务器默认也不读系统 PATH。它只认你在 VSCode 设置里显式填的两个路径——而且必须是真实可执行文件的绝对路径。
- 打开 VSCode 设置(
Cmd+,),搜索并填写:
•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才算生效
调试前 application:ensure_all_started/1 必须手动跑通
VSCode 调试器本质是启动一个带调试参数的 Erlang 节点再 attach,它不负责解决依赖缺失。如果你的 launch.json 里写的是 "startFun": "application:start",但实际项目里 myapp 依赖 cowboy 而 cowboy 没 start,调试器会直接报 {error,{not_started,cowboy}} 并退出,连断点都设不上。
- 务必在调试前走通这三步:
• 在项目根目录运行rebar3 shell
• 在 shell 里执行application:ensure_all_started(myapp).,确认返回ok
• 检查startFun是否匹配真实入口:有些项目用myapp:start/0,有些用myapp_app:start/2,函数签名错一个字符就失败 - 如果
application:ensure_all_started/1失败,先检查rebar.config是否声明了deps,以及myapp.app.src里的applications列表是否完整
分布式调试时节点名和 cookie 必须严格一致
VSCode 的 launch.json 里 "node": "myapp@127.0.0.1" 和 "cookie": "abc123" 不只是配置项,它们要和你在终端手动启动的节点完全一致,否则 attach 会拒绝连接。
- 启动远程节点时,必须用相同 cookie 和唯一节点名:
•erl -name node1@127.0.0.1 -setcookie abc123
•erl -name node2@127.0.0.1 -setcookie abc123 - VSCode 调试器默认启动的是
nonode@nohost,要改成带名字和 cookie 的节点,就得靠launch.json里的"node"和"cookie"字段驱动 - 容易被忽略的一点:
cookie文件(~/.erlang.cookie)内容必须和launch.json里写的完全一样,且权限为600;Windows 下尤其要注意换行符和 BOM











