erl命令必须在vscode内置终端中可用,否则所有扩展功能静默失效;需通过code .启动或配置shell环境确保path继承,并显式设置erlang.erlpath和erlang.rebar3path绝对路径。

erl 命令必须在 VSCode 内置终端中可用,否则所有 Erlang 扩展功能(跳转、补全、调试)都会静默失效——这不是插件没装好,是环境根本没接上。
确认 erl 和 rebar3 在内置终端里真能跑
打开 VSCode 内置终端(Ctrl+`),执行:
which erlwhich rebar3
如果任一命令返回空或 command not found,说明 VSCode 启动时没继承到你配置的 PATH。常见原因:
- 从桌面图标启动 VSCode → 它拿的是系统登录时的 PATH,不包含你 shell 配置里追加的 Erlang 路径
- Windows 上
erl.exe路径含中文或空格 → BEAM 启动失败,但错误不报在终端,只卡在语言服务器日志里 - 用
asdf管理版本 → 忘了运行asdf reshim erlang,导致which erl找不到软链接目标
修复方式只有一条:让 VSCode 继承正确的 PATH。要么在已配置好环境的终端里运行 code . 启动;要么把 Erlang bin 目录写进 ~/.zshrc(macOS/Linux)或系统环境变量(Windows),然后**完全退出 VSCode 再重启**。
erlang.erlPath 和 erlang.rebar3Path 必须填绝对路径
即使 which erl 有输出,erlang-ls 语言服务器默认也不读系统 PATH,它只认你显式配置的路径。打开 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", "startArgs": "[myapp]",但实际项目里 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,函数签名错一个字符就失败
launch.json 中的 startArgs 是字符串,不是 Erlang term —— 写成 "[myapp]" 是对的,写成 [myapp](无引号)会解析失败。
分布式节点调试时,cookie 同步比端口更关键
想用 VSCode 同时 attach 多个 Erlang 节点做分布式调试?别只盯着 port 和 hostName。Erlang 节点间通信靠 cookie 认证,如果两个节点 cookie 不一致,net_adm:ping/1 直接返回 pang,调试器连连接都建不起来。
实操要点:
- 所有节点启动时必须加
-setcookie my_cookie,且值完全一致(区分大小写) - VSCode 的
launch.json里cookie字段必须和节点启动时用的 cookie 完全相同 - Windows 用户注意:
-name后的节点名必须含@和域名(如node1@localhost),不能只写node1,否则节点无法联网
最容易被忽略的是:VSCode 调试器 attach 时用的 cookie 是配置项里的值,而你手动启动的节点用的是系统 ~/.erlang.cookie 文件内容 —— 两者不一致就白忙活。











