1. "注释撒谎"问题中注释与代码不同步时如何通过 CI 检测(markdownlint、Vale、textlint 校验文档与链接,扫描失效引用与过时示例)?
注释与代码不同步("注释撒谎")是常见问题。如何通过 CI 检测与文档链接校验来发现注释过时、失效引用与过时示例?
- 注释撒谎的成因与危害
- CI 中 markdownlint、Vale、textlint 等文档校验工具
- 失效链接、过时示例的自动扫描
(1)注释撒谎的成因:注释描述旧行为、引用已删除的 API、示例代码已不编译。读者若信注释会用错,不信则失去注释价值。核心是"注释与代码不同步"。 (2)CI 文档校验工具链:a) markdownlint 校验 Markdown 语法与风格(标题层级、代码块);b) Vale(或 textlint)做散文风格与拼写检查;c) textlint 校验中文/日文等语法的规则。这些作为 lint 步骤接入 CI。 (3)失效引用扫描:用 markdown-link-check、lychee 扫描文档中的外链与内链;用文档目录(如 Nav)校验站内引用;对 API 文档,用 tsdoc/javadoc 的 lint 检查 @link 引用的符号是否真实存在。 (4)过时示例检测:把文档中的代码示例纳入编译/单测(doctest),CI 中跑一遍确保示例可运行;示例与真实 API 签名用"示例即测试"(如 Javadoc 的 snippet 标签、Rustdoc doctest)绑定,防止示例与 API 漂移。 (5)定期兜底:对注释做"离线检测"——用复杂度分析(如注释与代码行的比例、注释引用的符号不存在时告警)在 CI 中拦截明显的撒谎注释。
注释撒谎的根因是"文档与代码双份维护"。CI 工具链(markdownlint/Vale/textlint 校验格式、link-check 校验引用、doctest 校验示例)把"注释与代码一致"从人治变成机器校验,让过时注释在 PR 阶段即暴露。
# lint 配置(示例)
- uses: markdownlint-cli2
- run: vale .
- run: textlint --rules textlint-rule-ja-no-mixed-period docs/
- run: lychee --offline docs/assets/ # 链接失效扫描