为什么你的docset搜不到符号:doc2dash对Sphinx、MkDocs和pydoctor文档的兼容性差异解析
【免费下载链接】doc2dashCreate docsets for Dash.app-compatible API browsers.项目地址: https://gitcode.com/gh_mirrors/do/doc2dash
doc2dash是一款广受好评的 docset 生成工具,它把已经构建好的离线文档转换成 Dash、Zeal 等 API 浏览器可高速检索的 docset。很多新手都会遇到一个令人抓狂的问题:docset 生成成功了,但在 Dash 里一搜却是空的。这几乎总是出在"符号索引"上——而 Sphinx、MkDocs 和 pydoctor 三种文档生成器,正是导致索引成败差异最大的三类。本文带你快速定位兼容性陷阱,让你的 docset 一搜就中。
先搞懂原理:docset 的符号从哪来?
doc2dash 搜索到的每一个函数、类、模块,都不来自 HTML 页面本身,而是来自一个名为objects.inv的"符号清单"文件。这是 intersphinx 规范的一部分:文档生成器把全部 API 符号及其所在页面写入该文件,doc2dash 再把它翻译成 Dash 的索引库。
检测逻辑非常直白(见src/doc2dash/parsers/intersphinx.py):
- 文档根目录没有
objects.inv→ doc2dash 直接判定"这不是我能处理的文档",整个 docset一个符号都不会有; - 文件存在但首行不是
# Sphinx inventory version 2→ 提示object.inv … exists, but is corrupt,同样放弃; - 项目名则从
# Project行读取,用作 docset 默认名称。
所以,搜不到符号的第一嫌疑永远是:objects.inv不存在或不完整。
Sphinx 文档:兼容性最好的"一等公民"
Sphinx 是 intersphinx 的"发源地",构建时默认生成objects.inv,与 doc2dash 配合最省心:
- 在文档目录执行
make html(或sphinx-build)后,产物目录_build/html根下就有objects.inv; - 直接把 doc2dash 指向该目录即可:
doc2dash _build/html; - 类型映射齐全,如
class、function、module都会正确归类到 Dash 的 Class / Function / Module 类型。
Sphinx 项目基本可以认为"开箱即用",是 doc2dash 支持最完善的文档格式。
MkDocs 文档:不开 mkdocstrings 就等于没有 API 数据
⚠️ 这是新手踩坑重灾区。MkDocs 本身不生成objects.inv,只有配合mkdocstrings插件时才会产出 intersphinx 清单:
- 如果目标项目没用 mkdocstrings,构建出的
site目录里就没有objects.inv——doc2dash 找不到任何 API 数据,docset 里全是空白; - 即使用了 mkdocstrings,它写入的类型键和 Sphinx 略有不同(例如属性写作
attr而非 Sphinx 的attribute),doc2dash 已在映射表中同时兼容了这些差异(见src/doc2dash/parsers/intersphinx.py中的INV_TO_TYPE),无需你操心; - 补丁 HTML 锚点时,doc2dash 也专门为 MkDocs 的导航链接结构做了适配。
一句话结论:MkDocs 项目的 docset 能不能搜到符号,取决于上游是否启用了 mkdocstrings,而不是取决于 doc2dash。
pydoctor 文档:21.2.0 是决定性分水岭
pydoctor 从21.2.0版本起原生输出 intersphinx 清单,从此 doc2dash 把它当作"标准 intersphinx 文档"处理:
- 用 21.2.0+ 构建的 pydoctor 文档:直接转换即可,一切正常;
- 更老的 pydoctor 文档没有
objects.inv,新版本的 doc2dash 已移除了对旧格式的专属支持,需要改用旧版 doc2dash 2.4.1 才能转换; - 测试资源里就保留了 pydoctor 与 Sphinx 风格的 HTML 样例(如
tests/parsers/intersphinx/pydoctor_example.html),可以直观对比两者结构差异。
三种文档格式兼容性速查表
| 文档生成器 | objects.inv 来源 | 兼容性要点 | 搜不到符号的常见原因 |
|---|---|---|---|
| Sphinx | 内置 intersphinx 扩展,默认生成 | 最完善,开箱即用 | 转错了目录(应指向_build/html) |
| MkDocs | 仅当启用 mkdocstrings 时生成 | 兼容attr等类型差异 | 项目未装 mkdocstrings,清单根本不存在 |
| pydoctor | 21.2.0+ 生成,旧版无 | 旧文档需旧版 doc2dash(2.4.1) | pydoctor 版本过低 |
doc2dash 索引条目为 0 时的 4 步排查法 🔍
转换结束时,doc2dash 会打印一条关键日志(见src/doc2dash/convert.py):
Added N index entries.
N 是红色 0还是绿色几百上千,直接决定 docset 是否可用。按顺序排查:
- 看文件:确认你指向的目录(Sphinx 的
_build/html或 MkDocs 的site)根下存在objects.inv,且首行是# Sphinx inventory version 2; - 看数字:
Added 0 index entries时,基本可以断定清单缺失、损坏或类型全部不识别; - 看警告:日志中出现
path '…' is in objects.inv, but does not exist. Skipping时,说明清单里引用的页面在构建产物里不存在(多为增量构建产物不完整),重新完整构建文档即可; - 看来源:🚫 官方文档明确警告——不要用从 Read the Docs 下载的预构建 HTML 来转换,那不是原始构建产物,索引不会工作。请务必自己从源码构建文档。
常见警告速查表
| 日志片段 | 含义 | 处理办法 |
|---|---|---|
object.inv … exists, but is corrupt | 清单首行格式不对 | 完整重新构建文档 |
path '…' … does not exist. Skipping | 清单引用的页面缺失 | 清掉旧构建缓存,全量重建 |
invalid line: … Skipping | 清单中存在无法解析的行 | 升级文档生成器/插件 |
Added 0 index entries | 一个符号都没索引 | 按上面 4 步排查法处理 |
构建前自检清单 ✅
- 文档是自己从源码完整构建的(非下载包)
- 构建目录根下有完好的
objects.inv - MkDocs 项目已启用 mkdocstrings
- pydoctor 版本 ≥ 21.2.0
- 转换输出中索引条目数量为绿色且非零
- 用
--index-page index.html指定主页面,浏览体验更佳
格式支持的完整说明可参考项目自带的 docs/formats.md,扩展自定义解析器的思路见docs/extending.md。
总结:doc2dash 对 Sphinx、MkDocs、pydoctor 的兼容差异,归根结底是"谁生成了objects.inv"这一件事。抓住它,你的 docset 搜索问题就解决了一大半。
【免费下载链接】doc2dashCreate docsets for Dash.app-compatible API browsers.项目地址: https://gitcode.com/gh_mirrors/do/doc2dash
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考