Cargo metadata 怎么只导出工作区包信息
如果 CI 只需要知道一个 Rust workspace 有哪些包,直接读取完整的 cargo metadata 结果往往会把依赖解析图也带进脚本。更稳妥的做法是固定 JSON 输出版本,再加上 --no-deps,让本次任务只围绕工作区成员展开。
官方地址:https://doc.rust-lang.org/cargo/commands/cargo-metadata.html
cargo metadata --format-version 1 --no-deps是本文的最小命令:--format-version 1固定机器可读格式,--no-deps把输出边界收窄到 workspace members;结果中的resolve不再提供完整依赖解析图。
cargo metadata输出 JSON,不应该让脚本依赖不明确的默认格式。--format-version 1让调用方明确自己读取的 schema 版本。--no-deps只保留工作区相关信息,不把完整依赖解析结果作为本次输入。- 验收时同时看
packages、workspace_members、workspace_root和resolve。
先把任务入口定成“工作区元数据”
这个命令适合给 CI、发布脚本或工程工具读取 workspace 的包清单。它输出的是面向机器的 JSON,不是给人浏览的 Cargo.toml 摘要。实际操作时,可以把任务在自己的工具界面中命名为“工作区元数据”,再把输出方式设为“JSON”。
本文后面的界面图是原创操作示意图,用来帮助理解配置和结果状态,不是 Cargo、Rust、IDE 或 CI 平台的真实截图。真正执行时,仍以项目目录中的 Cargo 配置和命令行返回值为准。

固定输出格式再开始读取字段
官方文档建议显式传入 --format-version,这样脚本不会把 Cargo 的默认输出变化当成自己的数据契约。当前命令文档列出的可用格式版本是 1,因此最小配置可以写成:
# 固定 Cargo 元数据 JSON 的格式版本,避免脚本依赖未声明的默认值 cargo metadata --format-version 1 # 需要指定 workspace manifest 时,用 --manifest-path 明确入口文件 cargo metadata --format-version 1 --manifest-path path/to/Cargo.toml
这一步只固定“输出长什么样”,还没有收窄“输出哪些对象”。如果脚本下一步只想枚举 workspace 包,还要继续加上 --no-deps。
打开 no-deps,只导出工作区包信息
把配置面板中的“只导出工作区包”打开,对应的命令就是:
# 只读取工作区成员的机器可读元数据,不把完整依赖解析图带入本次结果 cargo metadata --format-version 1 --no-deps
这里的“只导出工作区包”指 packages 数组不再把外部依赖包作为本次包清单展开,输出重点转向 workspace members。它不是把每个工作区包的 Cargo.toml 字段全部删掉;工作区包自身的依赖声明仍可能作为包定义的一部分出现。脚本要区分“包定义里的依赖声明”和“完整的依赖解析图”。
如果项目存在虚拟 workspace,当前工作目录不一定对应某一个根 package,但 workspace_members 仍然可以作为成员边界使用。需要调用某个 manifest 时,优先给出显式的 --manifest-path,减少 CI 工作目录变化带来的歧义。
按四个字段核对导出结果
配置完成后,不要只看命令是否退出成功,还要确认 JSON 的关键字段符合任务边界。可以把结果验收拆成四个屏幕区域:
packages:查看当前导出的包定义,确认它服务于工作区包清单。workspace_members:查看成员 Package ID 列表,这是判断 workspace 成员范围的核心字段。workspace_root:记录 workspace 根目录,避免脚本把别的项目当成当前项目。resolve:使用--no-deps时不把它当成完整解析结果;文档所描述的依赖解析对象会是null。
# 先导出固定版本的工作区元数据,再提取包名和成员 ID
cargo metadata --format-version 1 --no-deps \
| jq '{packages: [.packages[].name], workspace_members, workspace_root, resolve}'
上面的 jq 只是在结果上做字段投影,不改变 Cargo 的输出。对于严格 JSON 的下游脚本,应该按真实 JSON 解析,不要用正则去截取包名。还要允许未来出现新增字段,因为格式版本相同并不意味着字段永远不会增加。

把命令接到 CI 时保留错误边界
在 CI 中,建议把元数据命令当成一个有明确退出码的输入步骤:命令成功后再解析 JSON,命令失败时保留错误并停止后续包处理。不要因为输出为空就直接把它判断成“没有工作区包”,先区分命令错误、JSON 解析错误和确实没有匹配成员。
# 让 shell 在命令失败或管道中任一步失败时停止,避免把错误当成空清单 set -o errexit set -o pipefail # 固定输出版本和工作区边界,供后续脚本读取 cargo metadata --format-version 1 --no-deps > workspace-metadata.json # 只打印工作区包名;解析失败会让 CI 步骤返回非零状态 jq -r '.packages[].name' workspace-metadata.json
如果 CI 在多个子目录运行,最好统一使用 --manifest-path,并在日志中记录 workspace_root。这样包数量变化时,可以回到同一个 workspace 根目录判断是成员变更,还是工作目录选错。
几个容易混淆的边界
| 配置或字段 | 应该怎么理解 | 不要怎么用 |
|---|---|---|
--format-version 1 | 声明脚本读取的 JSON 格式版本 | 不要把它当成 Cargo 工具链版本号 |
--no-deps | 收窄工作区元数据范围,不获取完整依赖解析图 | 不要据此断言每个包定义都没有依赖字段 |
workspace_members | workspace 成员的 Package ID 列表 | 不要直接当作可显示的包名列表,必要时再关联 packages |
resolve | 无依赖解析图时不提供可遍历的解析对象 | 不要把 null 当成命令失败 |
常见问题
为什么必须写 --format-version 1?
因为脚本需要知道自己按照哪个 JSON 格式读取。显式传入版本可以减少对默认行为的依赖,也便于未来在升级 Cargo 时检查兼容边界。
--no-deps 会不会让 workspace 包自身的依赖声明消失?
不要把它理解成删除所有依赖字段。它主要收窄被输出的包范围,并且不提供完整的依赖解析图;工作区包自身的 manifest 信息仍可能含有依赖声明。
为什么 workspace_members 不是包名数组?
它保存的是 Package ID。脚本若需要展示名称,应根据 ID 与 packages 中的包定义建立关联,不要靠字符串截取路径或版本。
只导出工作区包后还能做依赖拓扑分析吗?
本文的命令不适合这个目标。依赖拓扑需要完整的解析信息,应单独设计输入和执行边界,不要把 --no-deps 的结果当成完整依赖图。
最终可以把配置路径记成:固定 format-version,开启 --no-deps,再按 packages、workspace_members、workspace_root 和 resolve 四处核对。这样 Cargo metadata 才真正成为 CI 可以稳定消费的工作区包信息入口。
漫狐漫画书架怎么整理?收藏、分类与离线内容的管理说明
- 上一篇
- 漫狐漫画书架怎么整理?收藏、分类与离线内容的管理说明
- 下一篇
- Cargo test 怎么只运行文档测试
-
- 文章 · 软件教程 | 1小时前 |
- GNU Make 怎么查看最终生效的变量和规则
- 370浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- GNU Make 并行构建时怎么避免日志互相穿插
- 470浏览 收藏
-
- 文章 · 软件教程 | 1小时前 | 测试 · rust · 软件教程 · doctest cargo test cargo test --doc Rust文档测试 Cargo教程
- Cargo test 怎么只运行文档测试
- 392浏览 收藏
-
- 文章 · 软件教程 | 1小时前 | 依赖管理 · rust · 软件教程 · 依赖树 cargo tree Rust依赖 cargo tree --duplicates 重复版本
- Cargo tree 怎么找出同时编译多个版本的依赖
- 202浏览 收藏
-
- 文章 · 软件教程 | 1小时前 | rust · 软件教程 · workspace Cargo cargo tree --invert Rust依赖
- Cargo tree 怎么反查是谁引入了某个依赖
- 415浏览 收藏
-
- 文章 · 软件教程 | 1小时前 | 软件教程 · Bazel 测试日志 失败测试 Bazel test --test_output=errors
- Bazel test 怎么只显示失败测试的日志
- 490浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- Bazel aquery 怎么确认实际执行的编译命令
- 450浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- Bazel query 怎么按规则类型筛选目标
- 222浏览 收藏
-
- 文章 · 软件教程 | 1小时前 | 故障排查 · cmake CTest --rerun-failed 失败测试 测试重跑
- CTest 怎么只重跑上次失败的测试
- 459浏览 收藏
-
- 文章 · 软件教程 | 1小时前 | cmake --prefix cmake --install CMAKE_INSTALL_PREFIX DESTINATION
- CMake 安装到自定义目录为什么路径不对
- 331浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- CMake 怎么只构建指定 target
- 254浏览 收藏
-
- 文章 · 软件教程 | 2天前 | 软件教程 · VS Code 自定义指令 GitHub Copilot 项目作用域
- GitHub Copilot 自定义指令文件的项目作用域
- 404浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 451次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 520次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 536次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 481次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 304次使用
-
- Go 1.24 tool 指令实战:别再让 tools.go 和 CI 工具版本打架
- 2026-06-01 249浏览
-
- Go 1.25 go vet 实战:把 WaitGroup 和 HostPort 坑挡在 CI 里
- 2026-06-02 185浏览
-
- Go 1.25 testing.Attr 实战:别让 CI 测试报告只剩一堆失败日志
- 2026-06-02 478浏览
-
- Go 多模块仓库怎么用 go.work:本地联调、依赖同步和 CI 一致性工作流
- 2026-07-15 380浏览
-
- Go 项目如何防止 Protobuf 生成代码漂移:把 protoc 检查接入提交前和 CI 门禁
- 2026-07-20 473浏览

