Rerun 开发工具聚合 crate re_dev_tools:设计思路、命令解析与新增工具指南
【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun
re_dev_tools是 Rerun 仓库中一个专门用于承载各类小型 Rust 开发脚本的聚合 crate(Combined development utilities)。它将构建 Web Viewer、生成示例 manifest、维护文档搜索索引等开发期工具统一收纳,并通过pixi run dev-tools这一统一入口对外暴露。阅读本篇,你将掌握该 crate 的模块结构、三大子命令(build-web-viewer、build-examples、search-index)的完整参数与底层构建流程,并学会如何在src下新增一个开发工具并接入命令行分发。
为什么需要这样一个聚合 crate
Rerun 的构建体系十分庞大,涉及 Wasm 构建、示例批量运行、文档索引等多个环节。如果每个小工具都单独建一个 crate,会无谓地增加工作区中的 crate 数量,也难以统一查看和管理。原 README 明确给出了这个 crate 的设计动机(见 crates/build/re_dev_tools/README.md):
- 合并小脚本:把较小的 Rust "脚本"集中放在这一个 crate 里,避免开发工具类 crate 数量膨胀;
- 统一视角:让开发者能够在一处概览所有用 Rust 编写的构建工具;
- 单一入口:通过
pixi run dev-tools --help查看全部可用工具。
从 Cargo.toml 可以看到,这个 crate 被标记为publish = false(不发布到 crates.io),其依赖也集中在开发工具所需的能力上:argh(命令行解析)、cargo_metadata(读取工作区元数据)、roxmltree(解析 XML)、toml/serde/serde_json(配置与数据序列化)、ureq(HTTP 请求,用于与 Meilisearch 等本地服务通信)、wasm-bindgen-cli-support(生成 Wasm 的 JS 绑定)等。这些依赖组合本身就从侧面印证了该 crate 的职责边界:构建脚本、文档索引与 Web 资产生成。
快速上手:统一入口与三大子命令
在仓库根目录执行以下命令即可查看全部工具及其帮助信息:
pixi run dev-tools --help其中pixi run dev-tools在 pixi.toml 中被定义为:
dev-tools = "cargo run --locked -p re_dev_tools --"即通过 Cargo 直接运行re_dev_tools这个包,--之后的所有参数都会被透传给程序本身。--locked保证使用锁定的依赖版本,保证开发环境可复现。
查看 main.rs 的源码可以看到,命令行分发使用argh完成,顶层TopLevel结构体通过#[argh(subcommand)]枚举定义了三个子命令:
| 子命令 | 对应模块 | 职责 |
|---|---|---|
build-examples | build_examples | 收集并构建全部示例(Python / Rust / C++ / Notebook),产出.rrd文件或示例 manifest |
build-web-viewer | build_web_viewer | 将re_viewer编译为 Wasm,并生成对应的.js绑定 |
search-index | build_search_index | 把文档与示例索引到本地 Meilisearch 实例,并提供终端 REPL 检索 |
main函数按枚举值将控制权分发给各模块的main,任何错误统一以anyhow::Result向上抛出:
match args.cmd { Commands::BuildExamples(args) => build_examples::main(args), Commands::SearchIndex(args) => build_search_index::main(args), Commands::BuildWebViewer(args) => build_web_viewer::main(args), }子命令一:build-web-viewer——Web Viewer 的完整构建流水线
build-web-viewer是三个子命令中最重的一个,它负责把 Rerun 的re_viewer编译成浏览器可加载的.wasm与.js绑定。子工具自带的 README 给出了两条典型用法:
# 默认 debug 构建 pixi run dev-tools -- build-web-viewer # release 构建并保留调试符号 pixi run dev-tools -- build-web-viewer --release -g需要说明的是,该 README 中命令在 argh 定义下等价于直接调用子命令,pixi run dev-tools -- build-web-viewer ...与pixi run dev-tools build-web-viewer ...都能工作,区别只在于--之后的参数不会与 pixi 自身的选项混淆。
命令行参数详解
参数定义位于 build_web_viewer/mod.rs,全部来自argh派生结构体:
| 参数 | 别名 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
--release | - | switch | 无 | 以web-releaseprofile 编译并运行wasm-opt优化;与--debug互斥 |
--debug | - | switch | 无 | 以 debug 模式编译且不运行wasm-opt;与--release互斥 |
--debug-symbols | -g | switch | 关闭 | 即使 release 构建也保留调试符号,便于 panic 时的调用栈和浏览器内 Wasm 性能分析 |
--target | -t | option | browser | 构建目标:browser/module/no-modules-base(后者专供rerun_js内做后处理) |
--out | -o | option | 见下文 | 输出目录,为相对 Cargo 工作区根的路径 |
--features | -F | option | analytics | 以逗号分隔的特性列表,透传给re_viewer的 Wasm 构建 |
--no-default-features | - | switch | 关闭 | 构建re_viewerWasm 时排除默认特性 |
--timings | - | switch | 关闭 | 生成 Cargo 构建耗时报告,输出到<target-dir>/cargo-timings/ |
其中--release与--debug必须二选一,源码中对此有显式校验——两者都未设置或同时设置都会直接报错(见 build_web_viewer/mod.rs):
Exactly one of --release or --debug must be set默认输出目录并非当前目录,而是写死的crates/top/re_web_viewer_server/web_viewer(见 build_web_viewer/lib.rs),这样构建产物可以直接被re_web_viewer_server使用——事实上该子命令正是被re_web_viewer_server的build.rs在构建期调用(见 build_web_viewer/README.md 的说明)。
底层构建三步走
从 build_web_viewer/lib.rs 的build函数可以还原完整的构建流水线:
- 编译 Rust 到 Wasm:以
re_viewer为包、--target=wasm32-unknown-unknown为目标执行cargo build,并把产物放到独立的target/wasm目录(嵌套在默认 target 目录内,这样cargo clean也能一并清理)。这里特意移除了环境中的RUSTFLAGS与CARGO_ENCODED_RUSTFLAGS,防止宿主机专属的链接参数泄漏到 Wasm 构建中,并显式加载.cargo/config.toml。 - 生成 JS 绑定:通过
wasm_bindgen_cli_support::Bindgen读取编译出的.wasm,按目标类型生成绑定——browser目标使用--no-modules且不输出 TypeScript 类型,module目标则输出模块化绑定并附带.d.ts。一个常见的失败信息是cannot import from modules (\env`) with --no-modules,这通常意味着某个依赖调用了std::time::Instant::now()之类的宿主环境 API;源码在报错提示中给出了用wasm2wat定位env` 导入的方法。 - wasm-opt 优化(仅 release):release 构建会调用
wasm-opt -O2做体积与性能优化,开启reference-types、simd、bulk-memory、nontrapping-float-to-int、multivalue等特性(与.cargo/config.toml中-Ctarget-feature的编译选项保持一致,JS 加载器通过 SIMD 特性检测来决定是否加载该 Wasm)。若-g被指定则保留调试符号,否则--strip-debug剥离符号。源码注释明确指出wasm-opt需要预先安装 binaryen,可通过apt/brew/dnf安装。
子命令二:build-examples——示例收集、运行与 manifest 生成
build-examples负责扫描仓库中所有示例并生成示例页面所需的索引。模块开头的文档注释(见 build_examples/mod.rs)说明了核心机制:
通过检查示例
README.mdfrontmatter 中是否设置了channel来识别可运行的示例。
channel的可选值及其语义:
| channel | 含义 |
|---|---|
main | 简单/快速的示例,在每次 PR 与main分支上构建 |
nightly | 较重的示例,每天构建一次 |
此外,示例还可以通过 frontmatter 中的build_args字符串数组指定运行时参数。
对应源码中 example.rs 的Example::load,每个示例会从examples/<语言目录>/<名字>/README.md解析出标题、描述、标签、缩略图、build_args、allow_warnings、include_in_manifest等元数据。语言目录的映射关系也在 example.rs 中定义:
| Language | 目录(相对examples/) | 扩展名 |
|---|---|---|
| Rust | rust | rs |
| Python | python | py |
| C++ | cpp | cpp |
| Notebook | notebook | ipynb |
build-examples本身还包含 5 个子子命令(见 build_examples/mod.rs):install(安装示例运行环境)、rrd(运行示例并产出.rrd录制文件)、manifest(生成示例索引 manifest)、snippets(处理文档代码片段)、notebook(处理 notebook 示例)。在 pixi.toml 中它被包装为独立任务:
build-examples = "uv run cargo run --locked -p re_dev_tools -- build-examples"子命令三:search-index——用 Meilisearch 索引全部文档与示例
search-index负责把仓库中的文档和示例收集起来,上传到本地 Meilisearch 实例完成全文索引(模块说明见 build_search_index/mod.rs)。它内部再分两个子命令:build(一次性完成 ingest + 索引)与repl(启动一个终端交互式检索客户端)。
子工具自带的 README 给出了三步标准流程:
# 1. 启动本地 meilisearch 实例 pixi run meilisearch # 2. 索引仓库中的文档内容 pixi run search-index build # 3. 针对本地 meilisearch 启动交互式 REPL pixi run search-index repl其中pixi run meilisearch在 pixi.toml 中被定义为在localhost:7700启动开发模式的 Meilisearch 实例(master key 为test,数据与快照分别存放在meilisearch/data.ms等目录下,可整体删除以彻底重置);pixi run search-index则对应 pixi.toml 中的定义,等价于运行re_dev_tools的search-index子命令。
build 与 repl 的公共参数
两个子命令共享同一组配置参数(定义见 build.rs 与 repl.rs):
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
index_name(位置参数) | positional | temp | 要创建/查询的 Meilisearch 索引名 |
--url | option | http://localhost:7700 | Meilisearch 地址 |
--master-key | option | test | Meilisearch master key,需同时具备读与写权限 |
--release-version | option | 无 | 用于生成文档 URL 的发布版本号 |
--ingest(仅 repl) | switch | 关闭 | 启动 REPL 前先执行一次文档收集与索引 |
默认值常量统一收敛在 build_search_index/mod.rs 中:
const DEFAULT_URL: &str = "http://localhost:7700"; const DEFAULT_KEY: &str = "test"; const DEFAULT_INDEX: &str = "temp";build的执行逻辑非常简单直接(见 build.rs):连接 Meilisearch → 运行ingest::run收集文档(覆盖文档、示例、各语言 API 参考)→ 写入指定索引。repl则在交互循环中不断读取标准输入,逐行把查询发送给本地索引并打印结果;若传入--ingest,会先执行与build相同的收集流程再进入交互(见 repl.rs)。仓库中 ingest 目录下的cpp.rs、docs.rs、examples.rs、python.rs分别对应不同语言与文档来源的收集器。
新增一个开发工具:两步接入
原 README 给出了新增工具的全部步骤,这也是把开发脚本沉淀进统一工具链的标准姿势:
- 在
src下新建一个文件夹,放入你的工具实现。参考现有布局,一个子工具通常包含:一个mod.rs(定义argh参数结构体与main分发函数),以及按需拆分的实现文件(如build_examples下按example、manifest、rrd、snippets、notebook等职责分文件)。 - 在 main.rs 中添加新的枚举条目:
mod声明新模块后,在Commands枚举中增加一个#[argh(subcommand)]变体,并在match中把解析出的参数交给新模块的main。由于解析与分发完全由argh的派生宏与顶层枚举驱动,新增一个子命令不需要改动其他任何代码。
完成上述两步后,pixi run dev-tools --help会自动列出新工具,pixi run dev-tools <新工具名> --help即可查看其参数说明。
与 pixi 任务体系的集成
re_dev_tools不要求开发者记住一长串cargo run -p re_dev_tools -- ...前缀——pixi.toml 中已把高频用法封装为语义化任务:
| pixi 任务 | 底层命令 | 用途 |
|---|---|---|
dev-tools | cargo run --locked -p re_dev_tools -- | 通用入口,后面直接跟子命令 |
build-examples | uv run cargo run --locked -p re_dev_tools -- build-examples | 构建示例与 manifest |
search-index | uv run --group docs cargo run --locked -p re_dev_tools -- search-index | 文档索引(附 docs 依赖组) |
rerun-build-web | cargo run -p re_dev_tools -- build-web-viewer --no-default-features --features analytics,map_view --debug | debug 构建 Web Viewer |
rerun-build-web-cli | rerun-build-web之后追加cargo build --package rerun-cli --no-default-features --features web_viewer | 构建 Web Viewer 及其 CLI |
rerun-build-web-release | 同上但以--release构建 | release 构建 Web Viewer |
meilisearch | 本地 Meilisearch 实例启动命令 | 为search-index提供后端服务 |
从 pixi.toml 的任务定义还可以看到,build-web-viewer子命令可以通过--features analytics,map_view与--no-default-features的组合来裁剪re_viewer的功能集,这验证了前面参数表中特性透传机制的实际用途。
小结
re_dev_tools是 Rerun 构建体系中一个典型的"工具聚合器":设计上通过单一 crate 收纳全部 Rust 开发脚本以避免 crate 数量膨胀,入口上通过pixi run dev-tools统一暴露,实现上以argh子命令枚举驱动三大功能模块——build-web-viewer(Wasm 构建 + 绑定生成 + 优化三步流水线)、build-examples(基于 README frontmatter 的示例收集与 manifest 生成)、search-index(面向 Meilisearch 的文档索引与终端 REPL)。理解它的结构与接入方式,等于掌握了 Rerun 开发期工具链的扩展入口,无论是为 CI 添加自定义构建步骤,还是为自己的开发流程沉淀脚本,都可以在此基础上快速落地。
【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考