cargo doc 私有项漏文档,我用 RUSTDOCFLAGS 卡住 CI
workspace 里 14 个 crate,Rust 1.75,CI 是 GitHub Actions 的 ubuntu-latest。有次合并前跑 cargo doc --workspace --no-deps,本地干净通过,第二天同事在 pub(crate) 的模块里发现一个函数签名改了文档没改,链接直接 404。原因是默认 rustdoc 不检查私有项,那些只在 crate 内部用的类型根本不在文档图里。
我的做法是先在本机把私有项也拉进来跑一遍:
RUSTDOCFLAGS="-D warnings --document-private-items" \
cargo doc --workspace --no-deps --all-features
--document-private-items 让 rustdoc 把私有模块、私有函数也生成文档,-D warnings 把断链、无效 HTML、过时 intra-doc link 全部升级成错误。CI 里就是同一行,放在 clippy 之后、测试之前,因为它比测试快很多,失败得早。
要注意 --no-deps 不能省,否则依赖 crate 的文档警告也会算到你头上,第一次跑就被一个第三方 crate 的断链卡住,查了半小时才发现不是自己的代码。另外 --all-features 会让一些只在特定 feature 下编译的模块也进文档,如果 feature 之间有互斥组合,得拆成两次跑,我是用 --features 显式列了常用的两组。
为什么值得这么做:rustdoc 的 intra-doc link 检查是在文档生成阶段解析路径的,[Foo] 指向不存在的项时默认只是警告,而私有项默认不参与,等于内部 API 的文档腐烂完全没人管。代价是文档生成时间从 8 秒涨到 20 秒左右,而且私有项多了之后输出很吵,第一次修了四十多个断链。
会失效的地方:#[doc(hidden)] 的项仍然会被跳过,宏生成的文档有时解析不到路径,cfg 屏蔽掉的代码在 --all-features 下也不一定全覆盖。我踩过的坑是某个模块只在 #[cfg(test)] 下存在,文档阶段根本看不到,链接检查通过但测试里引用已经坏了。
你们 workspace 里私有项的文档是靠什么兜底的,还是干脆不写?
0 条评论
还没有评论,写下第一条。