Rerun C++ SDK 文档写作指南:Doxygen 注释规范、本地构建与版本化发布工作流
【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun
Rerun C++ SDK 的 API 文档由 Doxygen 为骨架,完整讲解 C++ 文档的注释书写规范、本地构建与预览流程、版本化文档的生成发布机制,并结合 Doxyfile 与源码实例给出可落地的实践细节。
一、文档工作流总览:从源码注释到在线文档
Rerun C++ SDK 的文档体系是一条自动化流水线:
- 开发者在头文件中使用
///风格的 Doxygen 注释书写 API 文档; - 构建时由 MkDoxy 插件调用 Doxygen 提取注释、解析 Markdown,生成 HTML 站点;
- 本地产出位于
rerun_cpp/docs/html/,线上版本则由 CI 发布到版本化域名路径。
这一流程决定了文档的第一入口是源码注释本身,因此注释质量直接决定 API 文档质量。整条流水线通过 pixi 环境管理,构建命令定义在 pixi.toml 中(cpp-docs任务,cwd为rerun_cpp):
cpp-docs = { cmd = "doxygen docs/Doxyfile && echo '***************\nSuccess!\nOpen ./rerun_cpp/docs/html/index.html in your browser.'", cwd = "rerun_cpp" }可以看到该任务先运行doxygen docs/Doxyfile,成功后提示打开rerun_cpp/docs/html/index.html预览。
二、本地构建与预览文档
2.1 构建命令
在仓库根目录执行:
pixi run -e cpp cpp-docs-e cpp指定 pixi 环境(包含 Doxygen 等工具链);cpp-docs对应 pixi.toml 中定义的任务。
构建完成后,用浏览器打开:
rerun_cpp/docs/html/index.html2.2 Doxygen 配置的关键设定
Doxyfile 是本次构建的配置文件,几个与文档范围直接相关的选项:
| 配置项 | 值 | 作用 |
|---|---|---|
PROJECT_NAME | "Rerun C++ SDK" | 生成站点标题,出现在每个页面顶部 |
OUTPUT_DIRECTORY | "docs" | 输出目录,配合cwd = rerun_cpp即生成到rerun_cpp/docs/html/ |
OUTPUT_LANGUAGE | English | 生成页面语言 |
INPUT | README.md、cmake_setup_in_detail.md、arrow_cpp_install.md、src/ | 文档输入源:三个 Markdown 手册 + 全部源码目录 |
FILE_PATTERNS | *.md、*.hpp | 只解析 Markdown 与头文件(API 文档以头文件为准) |
RECURSIVE | YES | 递归扫描src/下所有子目录 |
USE_MDFILE_AS_MAINPAGE | README.md | 将 rerun_cpp/README.md 作为站点首页 |
GENERATE_HTML | YES | 生成 HTML 输出 |
WARN_AS_ERROR | FAIL_ON_WARNINGS | 出现文档警告时以非零状态结束构建,强制保持文档健康 |
其中WARN_AS_ERROR = FAIL_ON_WARNINGS值得特别注意:它不中断处理,但一旦存在未解析引用、错误命令等警告,构建即以失败告终。这意味着注释里的每一个\命令、每一个类型引用都必须正确,否则本地构建会直接报错——这是保证文档质量的硬性门槛。
2.3 定制化 HTML 外观
构建出的站点并非 Doxygen 默认样式,而是通过 rerun_cpp/docs/header.html 自定义了 HTML 头部,并在 Doxyfile 中配置了:
HTML_HEADER = docs/header.html:自定义页头模板;HTML_EXTRA_STYLESHEET = docs/doxygen-awesome/doxygen-awesome.css:接入 Doxygen Awesome 主题;HTML_EXTRA_FILES = docs/doxygen-awesome/doxygen-awesome-darkmode-toggle.js ...:附带暗色模式切换与代码片段复制按钮脚本。
从 header.html 可以看到页面加载了doxygen-awesome-darkmode-toggle.js与doxygen-awesome-fragment-copy-button.js,分别提供深色模式开关和一键复制代码片段功能。相关资源位于 rerun_cpp/docs/doxygen-awesome/。
三、版本化文档的生成与发布机制
线上文档与本地构建使用完全相同的流程生成,托管在公网对象存储上。发布规则如下:
- 每个合并到 main 分支的提交都会生成一份"滚动最新"文档,对应路径为
docs/cpp/main; - 每次发版会额外生成一份固化版本文档,路径形如
docs/cpp/0.23.3(以实际发布版本号为准)。
这种main/ 版本号双轨并行的设计,让使用者既可以查阅最新开发版 API,也能锁定某个具体 SDK 版本的接口行为,避免文档与代码版本错位。由于发布过程由 CI 在每次提交与打标签时自动触发,开发者本地只需保证构建成功(尤其是WARN_AS_ERROR约束下不产生警告),即可让线上文档保持最新。
四、C++ 文档注释书写规范
文档由 MkDoxy 插件处理,其内部调用 Doxygen 提取注释。Rerun C++ SDK 统一采用以下注释风格,保证全仓库文档的一致性:
4.1 基础语法规则
- 统一使用
///作为文档注释标记,不使用/** */或//!; - Doxygen 命令一律以反斜杠
\开头,例如\private、\cond、\endcond; - 能用 Markdown 表达的内容优先用 Markdown,尽量少用 Doxygen 专用命令,提高源码可读性与渲染一致性;
- 禁止使用
\brief:规范要求在注释顶部写一行简短描述,空一行后再写详细说明。Doxygen 会将首个段落作为 brief,后续段落作为 detailed description。
一个符合规范的注释示例(取自 rerun_cpp/src/rerun/recording_stream.hpp 的实际风格):
/// Creates a new recording stream to log to. /// /// All log functions early out if a recording stream is disabled. /// Naturally, logging functions that take unserialized data will skip the serialization step as well. rerun::RecordingStream(std::string_view app_id);4.2 隐藏内部实现:\private与\cond
C++ 头文件中包含大量内部辅助类型,需要从公开 API 文档中隐藏:
- 隐藏单个类或方法,在注释中直接使用
\private; - 隐藏成片条目,用条件块包裹:
/// \cond private ... // 需要隐藏的实现细节 /// \endcond真实用例可在 rerun_cpp/src/rerun/as_components.hpp 中找到:AsComponents主模板是公开文档化的 trait,而对Collection<ComponentBatch>、单个ComponentBatch及其Result包装等内置特化实现则被/// \cond private整体隐藏,并注明"Documenting the builtin genericAsComponentsimpls is too much clutter for the doc class overview"(为内置泛型实现编写文档会让类总览过于杂乱)。同样的模式也出现在 rerun_cpp/src/rerun/collection_adapter_builtins.hpp 中。
4.3 组织方式:用命名空间而非分组
- 避免使用 Doxygen 分组(groups),当命名空间可以表达相同层级时应优先使用命名空间;
- 引用类型时不要省略命名空间:写
rerun::Collection而不是Collection。两者通常都能工作,但完整的限定名能让读者立刻明确类型所属作用域,尤其在文档交叉引用与自动链接(AUTOLINK_SUPPORT)场景下更准确。
4.4 规范速查表
| 场景 | 写法 |
|---|---|
| 文档注释标记 | /// |
| Doxygen 命令前缀 | \(如\private) |
| 富文本格式 | 优先 Markdown,少用 Doxygen 命令 |
| 简短描述 | 顶部单行,空行后接详细说明,不用\brief |
| 隐藏单个条目 | 注释内写\private |
| 隐藏多个条目 | /// \cond private…/// \endcond |
| 分组 | 避免 groups,用命名空间 |
| 类型引用 | 使用完整限定名,如rerun::Collection |
五、源码中的规范实例解析
5.1RecordingStream的文档风格
rerun_cpp/src/rerun/recording_stream.hpp 是体现上述规范的最佳样本:类级注释以单行摘要开头,空行后展开多段详细说明,描述内部管线线性化、微批量(micro-batching)处理、自动时间戳等行为;成员函数注释同样遵循"单行摘要 + 空行 + 细节"的结构,并用纯文本(而非\brief)表达 brief 段落。
5.2AsComponents的隐藏与公开边界
rerun_cpp/src/rerun/as_components.hpp 演示了如何在一个模板 trait 上划分公开文档与内部实现:公开部分是AsComponents<T>主模板及其as_batches说明,以及引导使用者实现自定义特化的static_assert报错信息;内部则是一系列/// \cond private//// \endcond包裹的特化,避免类总览被模板噪音淹没。这正是"用\cond隐藏成片条目"规范在真实代码中的应用。
六、文档片段与测试的联动
除了 Doxygen 注释,文档中还嵌入了大量可执行代码片段。仓库专门维护了 rerun_cpp/docs/readme_snippets.cpp,其文件头注释明确说明:
// File used for snippets that are embedded in the documentation. // Compiled as part of the tests to make sure everything keeps working!该文件以/// [Logging]、/// [Streaming]、/// [Connecting]、/// [Buffering]等标签标记代码段边界,覆盖了日志记录、保存.rrd文件、gRPC 连接、缓冲后延迟连接等典型使用场景。它作为测试的一部分参与编译,确保文档中的示例代码始终可用——写文档的同时也在维护回归测试,这是保持文档"不腐烂"的关键机制。
七、为文档新增 Markdown 手册
需要补充长篇指南(而非 API 注释)时,只需把.md文件加入 Doxyfile 的INPUT列表,并确保符合FILE_PATTERNS = *.md与RECURSIVE = YES的扫描规则即可。当前输入包括:
- rerun_cpp/README.md:作为
USE_MDFILE_AS_MAINPAGE指定的首页; - rerun_cpp/docs/cmake_setup_in_detail.md:CMake 集成细节;
- rerun_cpp/docs/arrow_cpp_install.md:Arrow C++ 安装说明。
新增手册后运行pixi run -e cpp cpp-docs,即可在本地验证渲染效果;由于WARN_AS_ERROR = FAIL_ON_WARNINGS,任何 Markdown 引用错误或链接失效都会在构建期暴露。
八、写作与提交检查清单
结合上述全流程,为 Rerun C++ SDK 贡献文档时的完整检查清单如下:
- 注释使用
///,命令前缀用\,优先 Markdown; - 顶部单行摘要 + 空行 + 详细描述,不使用
\brief; - 内部实现用
\private或\cond private/\endcond隐藏; - 用命名空间组织层级,避免 groups;
- 类型引用写全限定名(如
rerun::Collection); - 文档片段如需嵌入,同步更新 rerun_cpp/docs/readme_snippets.cpp 并保证其通过编译;
- 本地执行
pixi run -e cpp cpp-docs验证构建无警告(WARN_AS_ERROR会在有警告时令构建失败),并检查rerun_cpp/docs/html/index.html的渲染结果; - 合并到 main 后,线上
docs/cpp/main将自动更新,发版后新增版本化文档。
这套"注释规范 + 构建工具链 + CI 发布 + 片段测试"的组合,使 Rerun C++ SDK 的文档能够与代码同步演进,既保证了 API 参考的准确性,也确保了示例代码的长期可用性。
【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考