用途:为 C++ 语言服务器生成 compile_commands.json(clang 编译数据库),使语言服务器能理解项目。每次运行该技能都应重新生成,即使已存在。MSBuild 场景写入工作区根目录的 .mscppls\compile_commands.json,mscppls 会自动发现工作区内任意 compile_commands.json,无需 cpp-lsp.json;建议把 .mscppls/ 加入 .gitignore。文件内容支持热重载,仅修改插件 lsp.json 或工作区 cpp-lsp.json 后才需 /restart。不要在同一个数据库中混用构建系统。
选择构建系统(优先执行):按优先级判断——用户明确意图、已提交配置(msbuild-extractor.json 表示 MSBuild;CMake preset 或既有 configure 表示 CMake)、工作区上下文(选中的 .sln/.slnx/.vcxproj 为 MSBuild)、仓库构建文档。硬性规则:仅当存在已提交 msbuild-extractor.json、任务明确为 MSBuild、或特定 .sln/.slnx/.vcxproj 被选为工作区/目标时,才运行 MSBuild 提取器并拒绝 CMake/Ninja 产物。反向保护:用户意图或已提交配置选择 CMake 时 CMake 优先。
CMake 项目:CMake 自行导出,无需外部提取器。配置时启用:cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON,然后 cmake --build build。文件位于 <build-dir>/compile_commands.json,在 cpp-lsp.json 中指向它。
MSBuild 项目:唯一正确方式是外部提取器 microsoft/msbuild-extractor-sample,必须运行它。不要手写、猜测或合成 compile_commands.json,不要直接调用 cl.exe/clang/clang-cl 或抓取构建日志,不要先编译项目(提取是设计时评估)。定位项目文件、解析一次配置、运行一次命令即停止;仅在非零退出且因 restore/init 生成文件缺失时,运行仓库文档中的 restore 或 init 一次后重试一次。
配置与平台解析:按层级——用户明确指定;已提交 msbuild-extractor.json(Tier 1,用 --config 传入,省略 -c/-a);解决方案或项目自身默认(Tier 2,用 -c/-a 显式传入);仍无法确定则交互式询问用户,自主运行中记录为未解决。绝不默认 Debug/x64。
Tier 1 命令:msbuild-extractor-sample.exe --config <path>\msbuild-extractor.json --solution <声明的解决方案> -o .mscppls\compile_commands.json。Tier 2 命令:msbuild-extractor-sample.exe --solution <已提交的 .sln 或 .slnx> -c <默认配置> -a <默认平台> -o .mscppls\compile_commands.json;单项目仓库用 --project <已提交的 .vcxproj>。
标志:Tier 1 用 --config + --solution(或 --project)+ -o;Tier 2 加 -c/-a。除非用户明确要求,不要传 --all-configurations、--merge、--deduplicate、--validate。不要创建、编辑或删除已提交的 msbuild-extractor.json。
提取器获取:先尝试 PATH 或 .tools\msbuild-extractor-sample.exe;不存在则下载固定版本 v0.3.0 并校验 SHA256(543c5cc6b57a1b3eb46b11e56b8f35a9ca8676106426bde6041ca2dc2e06f13c),二进制自包含无需 .NET 运行时。
开发者环境与多 VS 安装:默认不传工具链选择标志,由 vswhere 解析 MSVC;仅在解析失败或用户明确要求时用 --use-dev-env。多 VS 安装可用 --list-instances 与 --vs-instance <id>。
多配置:仅用户明确要求时用 --all-configurations --merge --deduplicate 合并,该并集不对应任何单一构建命令且跨机器不确定。
高级:对自带工具链(vendored/hermetic)的仓库,用 --msbuild-path 驱动仓库自身 MSBuild 进行进程外模式,避免系统 VS 与编译器版本不匹配导致的幻影错误。