vscode本身不运行ocaml程序,需依赖本地ocamlc、dune等工具;必须用opam安装并激活switch,每次新开终端执行eval $(opam env),验证which ocamlc和which dune有输出,手动配置ocaml.serverpath及dune-project文件(含精确(lang dune 3.11)),项目须置于原生linux路径。

VSCode 本身不运行 OCaml 程序,它只提供编辑和语言服务;真正编译和执行靠的是你本地装好的 ocamlc、ocamlopt 或 dune —— 配置失败的绝大多数情况,不是 VSCode 插件没装对,而是这些命令在终端里根本跑不起来。
确认 ocamlc 和 dune 能在终端中直接调用
这是整个流程的地基。VSCode 的 OCaml Platform 扩展完全依赖 shell 环境里的可执行文件路径。如果 which ocamlc 或 which dune 返回空,后面所有功能(类型提示、跳转、格式化)都会静默失效。
- 必须用
opam安装 OCaml,不要用系统包管理器(如apt install ocaml或brew install ocaml),否则ocaml-lsp-server找不到配套的编译器 ABI - 创建专用 switch:运行
opam switch create 5.1.0,再opam switch set 5.1.0 - 每次新开终端后,必须手动执行
eval $(opam env)—— VSCode 启动时不会自动读你的~/.zshrc - 验证:在 VSCode 集成终端里运行
which dune和which ocaml-lsp-server,两个都得有输出
手动填 ocaml.serverPath 是 Windows/WSL 用户的必选项
新版 OCaml Platform(v2.x+)在 Windows 原生或 WSL 下常因路径解析失败而 fallback 到空 LSP 实例,界面毫无报错,但悬停无类型、右键无法跳转 —— 这是“看起来装好了,实则全失效”的最常见原因。
- 打开 VSCode 设置(
Cmd+,或Ctrl+,),搜索ocaml.serverPath - 填入绝对路径,例如 WSL 中是
/home/yourname/.opam/5.1.0/bin/ocaml-lsp-server,Windows 原生是C:\Users\XXX\.opam\5.1.0\bin\ocaml-lsp-server.exe - 同时检查
ocaml.sandbox.root是否设为opam var prefix输出的路径(通常是~/.opam/5.1.0) - 改完设置后,按
Cmd+Shift+P→ 输入OCaml: Restart Server生效
dune-project 文件不是可选,是类型检查开关
没有 dune-project,ocaml-lsp-server 就不知道你在用 dune 构建,会退化为纯语法检查模式:模块不识别、跨文件跳转失效、接口签名不显示,连 List.map 的类型都 hover 不出来。
- 哪怕只写一个
hello.ml,也必须在同级目录放dune-project,内容至少是(lang dune 3.11) - 版本号不能写
(lang dune 3)或模糊值;查当前ocaml-lsp-server要求的最小 dune 版本:运行opam show ocaml-lsp-server | grep depends,看dune >= X.Y - 项目若含多个子目录(如
lib/、bin/),需在对应目录下加dune文件,例如bin/dune写(executable (public_name hello) (libraries ))
运行程序别依赖插件按钮,用终端 + dune exec
VSCode 没有“一键运行 OCaml”的原生机制。所谓“运行”,本质是调用构建工具生成可执行文件,再执行它。插件提供的运行按钮不可靠,且不支持带参数调试。
- 确保项目根目录有
dune-project和至少一个dune文件(如bin/dune) - 在集成终端中运行
dune build编译,成功后运行dune exec hello(hello是public_name值) - 想调试?用
dune exec --no-build -- ocamldebug _build/default/bin/hello.bc,或配launch.json调用ocamldebug - 临时测试单文件?仍可用
ocamlc -o test test.ml && ./test,但注意这绕过 dune 依赖解析,不适合多文件项目
最容易被忽略的点:WSL 用户绝不能把项目放在 /mnt/c/ 下,必须放在原生 Linux 路径(如 ~/workspace/ocaml-proj);ocaml-lsp-server 在 Windows 路径上会因符号链接和分隔符问题卡死超时,现象是状态栏一直显示“正在加载”。











