deptool
路径:
os/arceos/tools/deptool类型:库 + 二进制混合 crate 分层:ArceOS 层 / 宿主侧依赖图辅助工具 版本:0.1.0文档依据:Cargo.toml、src/lib.rs、src/main.rs、src/cmd_parser.rs、src/cmd_builder.rs、src/mermaid_generator.rs、src/d2_generator.rs、README.md
deptool 是一个很轻量的 ArceOS 依赖图辅助工具。它的真实工作方式并不复杂:先根据目标名称拼出 cargo tree 命令,再解析 --prefix depth 的输出,最后把 ArceOS 内部节点整理成 Mermaid 或 D2 文本。它不是构建系统,也不是工作区级依赖分析框架,而是一个围绕 cargo tree 的后处理脚本型工具。
架构设计
设计定位
从源码结构看,deptool 的职责非常聚焦:
- 解析命令行参数
- 生成
cargo tree调用命令 - 运行外部命令获取依赖树
- 过滤 ArceOS 内部节点
- 输出 Mermaid 或 D2 图描述
它没有自己的依赖解析器,也不读取 Cargo metadata;真正的依赖求解仍然交给 Cargo。
1.2 模块分工
当前实现只包含四个核心模块:
cmd_parser:解析命令行、判断目标位置、构造Configcmd_builder:拼接cargo tree命令字符串mermaid_generator:把层级依赖树转换为 Mermaid 边列表d2_generator:把层级依赖树转换为 D2 边列表
lib.rs 则负责把这几部分串起来:
- 执行命令
- 解析输出
- 生成图文本
- 打印并写入文件
1.3 真实执行链路
deptool 当前的执行流程可以概括为:
1.4 依赖图生成算法
图生成逻辑本身比较朴素,但是真实实现里有两个关键点:
cargo tree使用--format {p} --prefix depth输出,每行前缀中自带层级深度。- 生成器用
lastest_dep_map记录每个深度上的最近父节点,用parsed_crates避免对已展开节点重复深入。
这意味着它输出的不是 Cargo 完整原始树,而是“裁剪过重复子树后的 ArceOS 内部依赖边”。
1.5 当前实现对目录结构的假设
cmd_parser.rs 里把目标根目录硬编码为:
../../apps/../../crates/../../modules/../../ulib/
并通过这些相对路径判断目标名称属于 app、crate、module 还是 ulib。这个设计说明:
- 它面向的是特定目录布局的 ArceOS 源树
- 不是根工作区通用工具
- 也不是通过 Cargo workspace 元数据自动发现目标
在当前 TGOSKits 树形中,modules/ 和 ulib/ 仍然存在,但 apps/、crates/ 相关逻辑保留了较强的历史布局假设。
核心功能
功能概览
- 根据给定目标生成
cargo tree查询命令。 - 过滤出 ArceOS 内部依赖节点。
- 输出 Mermaid 或 D2 格式的依赖图文本。
- 既可作为二进制执行,也可作为简单库调用。
2.2 命令行接口
根据 cmd_parser.rs,当前 CLI 主要支持:
-t, --target:目标 crate/module/app/lib 名称-o, --format:mermaid或d2-f, --name:附加 features-d, --no-default:关闭默认 feature-s, --save-path:保存路径
其中最真实的细节有两个:
build_cargo_tree_cmd()实际拼出的命令是
cargo tree -e normal,build --format {p} --prefix depthfeatures最终被拼成-F feature1 feature2 ...
2.3 当前输出行为
虽然 Config 中保存了 output_loc,但 output_deps_graph() 当前实际固定写入 output.txt。也就是说,保存路径参数在当前实现里还没有真正传递到最终输出函数。
2.4 与构建工具的边界
deptool 只做“依赖图可视化文本生成”,并不:
- 生成配置文件
- 执行构建
- 启动 QEMU
- 管理镜像
它和 axbuild、tg-xtask 完全不是同一类工具。
依赖关系
直接依赖
clap:CLI 参数解析。