Monorepo 中合并多子包 JS 代码覆盖率报告需统一为 lcov 格式、集中归档、语义化合并;禁用非 lcov 报告器,归集各包 lcov.info 为 a.lcov/b.lcov,用 lcov --add-tracefile 合并并过滤无关路径,最后生成 HTML 报告验证。

在 Monorepo 中合并多个子包的 JS 代码覆盖率报告,核心是统一格式、集中归档、语义化合并。不能靠简单拼接文件,否则 Sonar、Codecov 等工具可能解析失败或统计失真。
确保所有子包输出标准 lcov 格式
lcov 是唯一能跨工具可靠合并的中间格式。其他格式(如 json-summary、text)不支持聚合。
- 用 Vitest:每个子包的 package.json 加命令:
"test:coverage": "vitest run --coverage --coverage.reporter=lcov" - 用 Jest:在各子包的 jest.config.ts 中设
coverageReporters: ['lcov'],且禁用其他 reporter - 避免混用工具:一个包用 c8、另一个用 Jest 自带 coverage,路径映射容易错乱,导致合并后文件识别失败
把各包 lcov.info 归集到统一目录并重命名
不能让每个包保留自己的 coverage/lcov.info,必须集中存放、按包区分,防止覆盖。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 在根目录创建 coverage/lcov/
- 运行所有子包测试后,执行归档命令(macOS/Linux):
mkdir -p coverage/lcov && find packages -name lcov.info -exec cp {} coverage/lcov/ \; -exec basename {} \; | sed 's/.info$/.lcov/' | xargs -I{} mv "coverage/lcov/{}" "coverage/lcov/{}" - 最终得到类似 coverage/lcov/a.lcov、coverage/lcov/b.lcov 的文件
用 lcov 命令语义化合并,不是 cat 拼接
cat a.lcov b.lcov > merged.lcov 表面合法,但同一源文件会重复出现两个 SF 块,SonarQube 可能只取第一个,造成覆盖率低估。
- 安装 lcov:
npm install -g lcov或直接用npx lcov - 初始化基础报告(推荐):
lcov --capture --initial --directory . --output-file coverage/base.lcov - 逐个添加子包报告:
lcov --add-tracefile coverage/lcov/a.lcov --add-tracefile coverage/lcov/b.lcov --output-file coverage/lcov.total.info - 过滤无关路径:
lcov --remove coverage/lcov.total.info 'node_modules/*' '**/*.test.*' '**/types/*' --output-file coverage/lcov.filtered.info
生成可读报告并验证结果
合并后别急着上传,先检查是否去重、统计是否合理。
- 生成 HTML 报告:
genhtml coverage/lcov.filtered.info --output-directory coverage/report - 查看文件列表(确认无重复):
lcov --list coverage/lcov.filtered.info - 检查汇总数据:
lcov --summary coverage/lcov.filtered.info - 若对接 SonarQube,建议额外加
--base-directory .参数标准化路径前缀,避免解析失败

















