bot-metric:面向 Rust 项目、Workspace 与单个源码文件的代码度量和质量分析工具,用于统一统计代码规模、复杂度、重复率、unsafe 使用与规则问题,并生成口径明确、可复核、可比较的结构化工程报告,帮助团队持续掌握代码质量变化,构建稳定、可判定、可追溯的 Rust 质量度量流程。

面向 Rust 项目、Workspace 与单个源码文件的代码度量和质量分析工具,用于统一统计代码规模、复杂度、重复率、unsafe 使用与规则问题,并生成口径明确、可复核、可比较的结构化工程报告,帮助团队持续掌握代码质量变化,构建稳定、可判定、可追溯的 Rust 质量度量流程。

分支3Tags6
文件最后提交记录最后更新时间
10 天前
10 天前
1 个月前
10 天前
23 天前
11 小时前
11 小时前
19 天前
11 天前
11 天前
10 天前
1 个月前
10 天前
1 个月前
1 个月前

BotMetric

Rust 源码只读度量工具:分析代码规模、函数复杂度、重复代码与 unsafe 使用,输出可定位的审查发现。

➡️ 这是什么 | 安装 | 快速开始 | 能力地图 | 命令与配置 | 输出 | 文档 ⬅️

Rust CLI Release MSRV Input Output Platforms


🤔 这是什么

BotMetric 是 Rust 源码体检工具。它读取 Cargo package、workspace 或单个 .rs 文件,输出规模、函数、复杂度、重复、unsafe 密度以及可定位的质量发现条目,并为每项结果记录统计范围和可信度。

默认分析只读,不修改源码、不运行项目二进制或测试。只有显式启用 --cargo-check、--rustc-check 或 --clippy-check 时,才会调用外部编译器收集诊断;编译失败不会抹掉已经完成的源码指标,而是将报告标为 partial。

你想知道什么 BotMetric 给出的结果
项目有多大 NBNC 代码行、文件规模和函数体规模。
哪些位置值得优先检查 超大文件/函数、复杂度、unsafe 和重复发现条目。
结果能否比较 每项指标带分子、分母、范围、状态、算法和可信度;比较基准可计算增量。
编译器发现了什么 可选保留 rustc/Cargo/Clippy 的原始诊断、位置与错误码。

当前源码分析以词法事实和 syn 3.x AST 为主,不假装提供类型解析、trait 求解、过程宏展开后 AST 或完整跨 crate 调用图;这些能力应由 rustc 或其他工具补充。


🛠️ 安装

需要 Rust 1.89+ 和 Cargo,支持 macOS、Linux 与 Windows MSVC。编译诊断仅用于可信项目。

cargo install bot-metric --version 1.2.3 --locked
bot-metric --version

🚀 快速开始

Cargo 项目:

cd /path/to/rust-project
bot-metric analyze

指定 workspace 或 package:

bot-metric analyze --manifest-path /path/to/Cargo.toml
bot-metric analyze --manifest-path /path/to/Cargo.toml --package app

单个文件:

bot-metric analyze /path/to/file.rs --edition 2021

需要结构化结果:

bot-metric analyze --format json --output bot-metric-report.json
bot-metric analyze --format sarif --output bot-metric.sarif

需要编译器诊断时显式打开:

bot-metric analyze --cargo-check
bot-metric analyze /path/to/file.rs --edition 2021 --rustc-check

🗺️ 能力地图

flowchart LR
    A[Cargo 项目] --> C[统一源码快照]
    B[单个 .rs 文件] --> C
    C --> D[词法事实]
    C --> E[syn AST]
    C --> F[Cargo target / cfg]
    D --> G[规模 / 重复 / unsafe]
    E --> H[函数 / 复杂度 / 规则]
    F --> I[范围与聚合]
    G --> J[Text / JSON / SARIF]
    H --> J
    I --> J
    K[可选 cargo/rustc/clippy] --> J
能力 说明
输入发现 读取 package、workspace、target、edition、feature 和本地模块;单文件不要求 manifest。
规模与复杂度 NBNC、文件/函数行数、圈复杂度和超阈值比例。
安全与重复 覆盖 unsafe block/fn/trait/impl,检测完整重复文件和连续代码窗口。
规则发现条目 以 BM 编号、文件位置、原因、定义和建议输出可修复问题。
cfg 与聚合 对 target/cfg 做三态判断,按选择的 scope 与 aggregation 汇总。
编译诊断 可选读取 Cargo、rustc 或 Clippy,保留原始渲染和错误码。
基线 在相同配置和范围下比较指标增量、新增与已解决发现条目。

🧭 命令与配置

日常入口按分析目标组织:

任务 命令 分析范围
查看整个 Cargo 项目 bot-metric analyze 当前项目源码树,共享文件只统计一次。
查看一个 Rust 文件 bot-metric analyze path/to/file.rs 只读取指定文件,不要求 manifest。
连同本地模块一起查看 bot-metric analyze path/to/file.rs --resolve-modules 从指定文件继续发现本地 mod。
检查某个 target bot-metric analyze --target app --scope reachable 只读取该 target 能够到达的本地代码。
按团队策略门禁 bot-metric check PATH --config bot-metric.toml 按配置生成发现条目并决定退出码。
保存或比较基准 baseline create / baseline compare 在相同配置和范围下比较质量变化。

默认使用 scope = auto 和 aggregation = physical:Cargo 项目扫描源码树,每个物理文件只统计一次。只有需要比较不同 target/cfg 实际看到的代码时,才使用 --scope reachable --aggregation view。

常用选项包括 --package、--target、--features、--include-tests、--resolve-modules、--format、--config、--cargo-check 和 --clippy-check。完整参数以 bot-metric <command> --help 和命令手册为准。

团队配置可以从下面这份门禁示例开始。quality_targets 默认启用;这里显式写出目标,方便评审和比较基准复用。

[analysis]
source_scope = "auto"
aggregation = "physical"

[thresholds]
huge_file_lines = 2000
huge_function_lines = 50
huge_complexity = 20
duplication_min_lines = 10
duplication_max_findings = 20
duplication_snippet_lines = 18
duplication_max_index_bytes = 536870912
duplication_max_verifications = 10000000
duplication_output_bytes = 0 # 0 表示不限制报告大小
finding_arena_bytes = 16777216
finding_spill_bytes = 536870912

[rules]
duplication_findings = "off" # off | top | all
unknown_policy = "fail"
blocking_severities = ["warning", "error"]
blocking_rules = []

[quality_targets]
item_target = "none" # item selector 下可设为 "input" 或 "each_item"
max_average_file_lines = 300
max_average_function_lines = 30
max_average_cyclomatic = 5
max_code_duplication_ratio = 0.10
max_file_duplication_ratio = 0.04
max_unsafe_density = 0.10
max_code_size_growth_ratio = 0.0
disabled_targets = []

duplication_findings = "off" 仍会计算重复率,只是不生成 BM006/BM007 位置发现条目;需要审查具体重复片段时改为 top 或 all。blocking_severities 使用程序默认的 warning/error;如果团队只希望 error 阻塞,可显式改成 ["error"]。

max_code_size_growth_ratio 只有在 check --baseline FILE 时才有比较基准的意义。命令行阈值优先于配置文件,配置、质量目标和缓存语义见配置手册。

重复检测字段怎样影响大项目
字段 作用
duplication_max_findings top 模式最多输出的发现条目组数,不截断入选组的位置。
duplication_snippet_lines 终端重复片段的上下文行数,位置列表不截断。
duplication_max_index_bytes 重复窗口索引内存上限;超限时指标变为 partial 并记录 BM202。
duplication_max_verifications 候选和文件字节精确复核上限;超限时保留已验证下界并记录 BM202。
duplication_output_bytes 报告大小上限;0 表示不限制,超限不会写出截断报告。
finding_arena_bytes 发现条目预物化的内存预算;超出后转入临时存储。
finding_spill_bytes 发现条目临时存储总预算;超限会明确标记不完整,不静默丢弃。

📦 输出与结果

人类可读输出

人类可读模式固定先回答“分析是否完成”,再回答“应该检查哪里”:

Execution Status
  status:                Complete
  origin:                Cargo
  aggregation:           Physical
  files:                 42
  metrics:               43
  findings:              2
  compiler diagnostics:  0
  analysis errors:       0

  Scope
    source scope:    Tree
    packages:        1
    targets:         2
    views:           2
    compiler check:  not requested

  Codebase
    code lines:  12,480
    functions:   436

  Key Metrics
    avg file lines:      297.1 lines
    avg function lines:  21.4 lines
    avg complexity:      2.7
    code duplication:    4.82%
    unsafe density:      0.03%

  Finding Breakdown
    BM001      1  functions too large
    BM004      1  functions too complex

Diagnostics
warning[BM001]: function `parse` is too large
  --> src/parser.rs:18:8
   |
 18 | pub fn parse(...) {
   |        ^^^^^
  = reason: 73 code lines exceed the limit of 50 by 23
  = definition: code lines exclude blanks and comment-only lines
  = help: extract cohesive steps into helper functions

终端会列出每条发现条目的文件位置、源码范围、reason、definition 和 help;编译器问题优先保留 rustc 原始渲染。没有可靠源码位置时只展示消息和日志证据,不伪造行号。

规则与运行诊断

诊断码 机器规则 ID 含义
BM001 rust.function.too_large 函数体代码行数超过配置上限。
BM002 rust.safety.unsafe_usage unsafe 函数或代码块需要审查。
BM003 rust.file.too_large 文件代码行数超过配置上限。
BM004 rust.function.too_complex 函数圈复杂度超过配置上限。
BM006 rust.code.duplicated_block 规范化 NBNC 代码片段超过重复阈值。
BM007 rust.file.exact_duplicate 文件原始字节完全相同。

运行链路中的 partial/error 也使用稳定编号:BM100–BM199 表示输入与目录扫描,BM200–BM299 表示语法和源码事实,BM300–BM399 表示 Cargo/rustc 启动、超时或非零退出,BM400–BM499 表示配置、输出、比较基准和契约错误。rustc 的 E#### 等原始错误码保持不变,不映射为 BM。

机器输出与契约

输出 适用场景
JSON 读取状态、能力矩阵、指标、diagnostics 和发现条目。
SARIF 上传到代码扫描或 CI 平台。
Baseline 在相同配置与范围下比较质量变化。

报告中的每项指标包含 numerator、denominator、scope、status、algorithm_id 和 confidence;其中 confidence 表示可信度。NBNC、函数体范围、重复窗口、unsafe 覆盖和 not_applicable/unknown/partial 的判定口径见指标与发现条目。

退出码为:0 完整且通过,1 阻塞性发现条目,2 CLI/配置/输入错误,3 报告已写出但分析或编译诊断不完整,4 保留兼容。自动化应同时读取退出码和报告状态。

BotMetric 1.2.3 的新报告使用 analysis-report-1.2.3.json 的版本化 Schema URI,并以 compiler_run.timed_out 明确区分编译器超时与普通非零退出;已发布的 1.2.1 和 1.2.0 报告 Schema 保持不变,供消费者按 URI 选择。component-info.json 会声明当前报告契约;BotGate 接入时应声明产物路径并直接读取 diagnostics[],不要解析人类可读文本。


📚 文档

入口 适合解决的问题
使用手册 从输入选择到配置、报告、CI 和发布。
输入与分析 Cargo、单文件、scope、cfg 和模块发现。
指标与发现条目 公式、阈值、规则码和状态口径。
报告与契约 JSON/SARIF、Schema、比较基准和组件接口。
BotGate 集成 在质量门禁中消费分析产物。
基准说明 复现性能数据与资源预算。
发布与兼容性 构建、打包、平台验证和契约检查。

版本边界

本发布说明对应 BotMetric 1.2.3,Rust edition 为 2024,MSRV 为 Rust 1.89。analysis-report-1.2.0.json 和 analysis-report-1.2.1.json 是已发布兼容契约,analysis-report-1.2.3.json 是当前结构化编译器超时报告契约;这些 URI、component-info.json 能力契约、CLI 行为、配置字段、BM 诊断编号、退出码和组件集成约定属于兼容边界。内部 Rust 模块、实现细节和未声明的扩展字段不属于稳定 API 承诺。

项目介绍

面向 Rust 项目、Workspace 与单个源码文件的代码度量和质量分析工具,用于统一统计代码规模、复杂度、重复率、unsafe 使用与规则问题,并生成口径明确、可复核、可比较的结构化工程报告,帮助团队持续掌握代码质量变化,构建稳定、可判定、可追溯的 Rust 质量度量流程。

定制我的领域