news 2026/9/15 21:25:38

Rerun 开发工具聚合 crate re_dev_tools:设计思路、命令解析与新增工具指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rerun 开发工具聚合 crate re_dev_tools:设计思路、命令解析与新增工具指南

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-viewerbuild-examplessearch-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-examplesbuild_examples收集并构建全部示例(Python / Rust / C++ / Notebook),产出.rrd文件或示例 manifest
build-web-viewerbuild_web_viewerre_viewer编译为 Wasm,并生成对应的.js绑定
search-indexbuild_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-switchweb-releaseprofile 编译并运行wasm-opt优化;与--debug互斥
--debug-switch以 debug 模式编译且不运行wasm-opt;与--release互斥
--debug-symbols-gswitch关闭即使 release 构建也保留调试符号,便于 panic 时的调用栈和浏览器内 Wasm 性能分析
--target-toptionbrowser构建目标:browser/module/no-modules-base(后者专供rerun_js内做后处理)
--out-ooption见下文输出目录,为相对 Cargo 工作区根的路径
--features-Foptionanalytics以逗号分隔的特性列表,透传给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_serverbuild.rs在构建期调用(见 build_web_viewer/README.md 的说明)。

底层构建三步走

从 build_web_viewer/lib.rs 的build函数可以还原完整的构建流水线:

  1. 编译 Rust 到 Wasm:以re_viewer为包、--target=wasm32-unknown-unknown为目标执行cargo build,并把产物放到独立的target/wasm目录(嵌套在默认 target 目录内,这样cargo clean也能一并清理)。这里特意移除了环境中的RUSTFLAGSCARGO_ENCODED_RUSTFLAGS,防止宿主机专属的链接参数泄漏到 Wasm 构建中,并显式加载.cargo/config.toml
  2. 生成 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` 导入的方法。
  3. wasm-opt 优化(仅 release):release 构建会调用wasm-opt -O2做体积与性能优化,开启reference-typessimdbulk-memorynontrapping-float-to-intmultivalue等特性(与.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_argsallow_warningsinclude_in_manifest等元数据。语言目录的映射关系也在 example.rs 中定义:

Language目录(相对examples/扩展名
Rustrustrs
Pythonpythonpy
C++cppcpp
Notebooknotebookipynb

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_toolssearch-index子命令。

build 与 repl 的公共参数

两个子命令共享同一组配置参数(定义见 build.rs 与 repl.rs):

参数类型默认值说明
index_name(位置参数)positionaltemp要创建/查询的 Meilisearch 索引名
--urloptionhttp://localhost:7700Meilisearch 地址
--master-keyoptiontestMeilisearch master key,需同时具备读与写权限
--release-versionoption用于生成文档 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.rsdocs.rsexamples.rspython.rs分别对应不同语言与文档来源的收集器。

新增一个开发工具:两步接入

原 README 给出了新增工具的全部步骤,这也是把开发脚本沉淀进统一工具链的标准姿势:

  1. src下新建一个文件夹,放入你的工具实现。参考现有布局,一个子工具通常包含:一个mod.rs(定义argh参数结构体与main分发函数),以及按需拆分的实现文件(如build_examples下按examplemanifestrrdsnippetsnotebook等职责分文件)。
  2. 在 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-toolscargo run --locked -p re_dev_tools --通用入口,后面直接跟子命令
build-examplesuv run cargo run --locked -p re_dev_tools -- build-examples构建示例与 manifest
search-indexuv run --group docs cargo run --locked -p re_dev_tools -- search-index文档索引(附 docs 依赖组)
rerun-build-webcargo run -p re_dev_tools -- build-web-viewer --no-default-features --features analytics,map_view --debugdebug 构建 Web Viewer
rerun-build-web-clirerun-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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 21:24:12

OpenClaw Windows 安装指南:智能体网关部署与配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/15 21:23:01

DB2联邦实战:跨库查询架构、配置与优化指南

很多DBA第一次接触DB2联邦&#xff08;Federation&#xff09;这个功能时&#xff0c;第一反应是“这不就是分布式数据库吗”&#xff0c;第二反应是“那我直接连源库查不就行了”。这两个反应我都经历过&#xff0c;实际在银行、制造业的项目里摸爬滚打之后&#xff0c;才真正…

作者头像 李华
网站建设 2026/9/15 21:22:45

SAP Fiori扩展字段发布后不可见的排查指南

1. 问题现象与背景分析作为一名长期从事SAP Fiori开发的顾问&#xff0c;我经常遇到客户提出这样的疑问&#xff1a;"明明在Custom Fields and Logic里发布了扩展字段&#xff0c;为什么在Available Fields列表里却找不到&#xff1f;"这个看似简单的问题背后&#x…

作者头像 李华
网站建设 2026/9/15 21:22:03

ASP.NET预约洗车系统源码解析:数据建模、状态机与并发事务实战

简介&#xff1a;这是一份面向ASP.NET学习者与毕业设计选题学生的预约洗车系统完整源码&#xff0c;采用C#语言开发&#xff0c;基于ASP.NET的Web Forms框架构建。系统按业务功能划分清晰&#xff0c;包含前台用户模块与后台管理模块&#xff0c;适合需要快速搭建可用项目或参考…

作者头像 李华
网站建设 2026/9/15 21:19:22

想存抖音视频却要录屏?开源工具 douyin-downloader 实测全记录

想存抖音视频却要录屏&#xff1f;开源工具 douyin-downloader 实测全记录 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallba…

作者头像 李华
网站建设 2026/9/15 21:18:21

VirtualApp 悬浮窗权限适配:从宿主到沙盒的 4 个关键卡点

VirtualApp 悬浮窗权限适配&#xff1a;从宿主到沙盒的 4 个关键卡点 【免费下载链接】VirtualApp Virtual Engine for Android(Support 14.0 in business version) 项目地址: https://gitcode.com/GitHub_Trending/vi/VirtualApp 悬浮窗是沙盒应用的基础能力&#xff0…

作者头像 李华