VSCode Erlang配置失败的主因是erl和rebar3在内置终端不可用,须确保which erl返回路径、显式设置绝对路径、继承正确PATH、配置tasks.json编译任务,并调试前验证application:ensure_all_started。

VSCode 本身不运行 Erlang,它只调用你本地装好的 erl 和 rebar3;所有“点不动”“跳转灰”“调试失败”的问题,90% 是因为这两个命令在 VSCode 内置终端里根本跑不起来。
which erl 在 VSCode 终端里必须返回路径
这是整个配置的起点。插件(比如 pguyot.erlang)启动语言服务器前,会静默尝试执行 erl -noshell -eval 'halt().' -sname test;失败就退出,不报错、不提示,只留一堆不可用功能。
- 按
Ctrl+`打开 VSCode 内置终端,直接运行: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)
–erlang.rebar3Path→ 填/home/you/.local/bin/rebar3这类真实路径,不是rebar3.bat,也不是符号链接本身 - 注意:
–erl.exe路径不能含空格或中文(Windows)
– 不要填目录,比如C:\Program Files\erl-25.3\bin\;必须精确到可执行文件本体
– 改完后必须彻底重启 VSCode —— 语言服务器不会热重载 - 验证方式:打开任意
.erl文件,右下角状态栏出现erlang-ls: ready才算生效
tasks.json 必须基于 rebar3 编译
VSCode 的“运行”按钮不会自动编译 Erlang 项目。你得手动配置 tasks.json 把 rebar3 compile 接进来,否则改完代码直接调试,只会遇到未编译模块或依赖缺失错误。
- 在项目根目录创建
.vscode/tasks.json,内容类似:{ "version": "2.0.0", "tasks": [ { "label": "rebar3 compile", "type": "shell", "command": "rebar3 compile", "group": "build", "problemMatcher": "$erlang" } ] } - 关键点:
–command必须是完整可执行命令,不要加cd xxx &&(除非工作区不在项目根目录)
–problemMatcher: "$erlang"能把编译错误定位到源码行,不加就只能看到终端输出
– 如果项目结构多层嵌套,确保cwd正确,或把rebar3放到项目根目录再调用 - 配置后,在命令面板(
Cmd+Shift+P)执行Tasks: Run Build Task,选rebar3 compile测试是否成功
调试前必须手动验证 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中的node字段必须和 shell 中节点名一致(如myapp@127.0.0.1),且 cookie 必须与~/.erlang.cookie完全相同 - 容易被忽略的细节:
– 分布式调试时,多个节点必须用相同 cookie,且-name不能用localhost(要用具体 IP 或127.0.0.1)
–erlang-ls调试器不支持热加载,改代码后需重启节点



















