
ccusage 项目 Rust 代码相似度检测实战用 similarity-rs 定位重复代码并安全重构【免费下载链接】ccusagenpx ccusage项目地址: https://gitcode.com/gh_mirrors/cc/ccusageccusage 是一个以 Rust 为核心实现的开源 CLI 工具npx ccusage其生产代码分布在rust/crates与rust/adapters的多个 crate 中包含大量 parser、loader、report 模块天然容易积累重复的函数、impl 方法和并行结构体。本文基于仓库中reduce-similarities技能文档讲解如何使用 Nix dev shell 内置的similarity-rs工具对.rs文件做相似度扫描、解读分数并制定重构决策。读完本文你将掌握相似度检测的完整命令组合、每个 CLI 参数的作用边界以及哪些重复必须重构、哪些重复应该保留的分诊方法。similarity-rs 从哪来Nix dev shell 中的similarity工具similarity-rs并不是独立的第三方二进制而是随 ccusage 的 Nix 开发环境一起提供。在 nix/dev-shell.nix 的buildInputs列表中可以看到similarity被显式加入第 62 行与ast-grep、ripgrep、fd、just等开发工具并列similarity ast-grep ripgrep fd因此工具的实际命令名是similarityskill 文档中写作similarity-rs指代同一个 CLI。使用方式有两种已在 Nix dev shell 内例如通过direnv allow初始化环境后直接运行similarity-rs在 shell 之外需要前缀direnv exec .进入开发环境再执行例如direnv exec . similarity-rs .。开发环境的初始化与依赖安装由nix/dev-shell.nix的shellHook负责它会比较pnpm-lock.yaml与nix/tools/*/bun.lock的时间戳在 lockfile 更新后自动执行just install确保工具链与依赖一致见 nix/dev-shell.nix。需要说明的是这个技能只负责Rust代码的重复检测。TypeScript/JavaScript 侧的重复代码不在本工具职责范围内应转由typescript与ast-grep技能处理见 .agents/skills/reduce-similarities/SKILL.md 的边界说明以及 AGENTS.md 中的技能路由表。基本用法一次扫描两个关键参数similarity-rs直接对路径执行扫描默认扫描当前目录.也可以显式传入路径# 扫描整个仓库 similarity-rs . --threshold 0.85 --min-lines 5 # 只扫描某个 crate例如 codex 适配器 similarity-rs rust/adapters/codex --threshold 0.85 --min-lines 5--threshold 0.85相似度门槛--threshold控制报告的灵敏度0.85 表示相似度达到 85% 及以上的代码片段才会被报告。分数越高说明两段代码越接近100% 匹配完全相同的代码块95%100%几乎一致仅少量差异85%95%结构相同、细节有别。阈值越高报告越少、越精确调低阈值可以挖掘更多形似而神异的候选但噪声也会增加。--min-lines 5最小片段行数--min-lines过滤掉过短的匹配。小于该行数的代码如一两行的赋值不值得报告避免把常见的短小惯用法误报为重复。--experimental-types补上类型定义这一路这是本工具最容易踩的坑函数扫描与类型定义扫描是分开的两趟 pass因此默认运行会静默漏掉并行的 struct 和 enum 定义similarity-rs . --threshold 0.85 --experimental-types也就是说默认跑一次只覆盖函数、方法层面的重复如果你正在排查几个结构体字段完全相同这类问题必须加上--experimental-types才会看到结果。技能文档特别提醒默认运行会静默错过并行的 structs 和 enums这是代码评审时最常见的漏检场景。其他辅助参数--print直接打印匹配到的代码片段便于肉眼比对而不是只给出行号或分数--skip-test当形如 fixture 的测试函数淹没真实发现时加上它跳过测试代码让生产代码的重复浮出水面--help查看全部剩余参数similarity-rs --help。分诊Triage分数只是起点不是结论工具给出的相似度分数只是线索是否值得重构取决于代码的语义角色。技能文档给出了明确的分诊规则按分数与形态分类值得重构的场景检测形态推荐做法100% 完全匹配提取共享函数或泛型shared function / generic95%100% 且跨越不同类型改为带 trait bound 的泛型函数多个类型上有重复的 impl 方法用带默认实现的 trait 收敛85%95% 的 match 分支或错误处理提取共享 helper 或宏macro字段完全相同的并行 struct提取共享基类base struct或泛型 struct这五种形态覆盖了 ccusage 代码库中最常见的重复来源多个 adapter 的 parser/report 模块之间往往存在高度相似的 match 分支、错误处理链和字段布局是--threshold 0.85最值得关注的对象。应该放过的场景以下情况通常不要动强行重构反而降低可读性简短的new()构造函数简单的From/Intotrait 实现任何可以通过derive宏自动生成的样板代码。这一条与仓库的实际代码风格一致rust/adapters下的 parser 大量使用#[derive(Debug, Default, Deserialize)]等派生宏例如 rust/adapters/amp/src/parser.rs 中的类型定义这类代码正是derive 已处理、无需手写去重的典型——它们不应该出现在重构清单里。报告规范输出 before/after而不是分数列表技能文档对输出提出了明确要求每个存活的候选surviving candidate必须以具体的 before/after 形态报告而不是罗列一堆相似度分数。原因是分数只说明像不说明怎么改before/after 给出可评审、可落地的重构方案让代码评审者一眼看出改动意图。例如针对一个 100% 匹配的重复报告应呈现为重构前两处相同函数体重构后提取为共享函数并两处调用而不是发现 3 对相似代码分数 0.95。在评审流程中的定位reduce-similarities是 ccusage 代码评审工作流中的一个环节与 .agents/skills/rust/SKILL.md 配合使用——后者在第 33 行明确指出拆分大模块或排查重复时使用reduce-similarities。典型的触发场景包括评审.rs文件时发现重复的函数或 impl 方法发现并行定义的 struct 与 enum需要加--experimental-types准备提取共享 helper 之前先用工具确认重复范围。整个技能体系通过 AGENTS.md 的路由表与 nix/agent-skills.nix 的打包机制分发sync-agent-skills会把.agents/skills目录下的技能含本技能链接到.claude/skills供 Agent 在任务中按需加载。小结similarity-rs在 ccusage 项目中是一把重复代码探测器来自 Nix dev shell一条命令即可扫描整个仓库--threshold与--min-lines控制报告灵敏度--experimental-types补齐类型定义扫描--skip-test排除 fixture 噪声。拿到分数后遵循100% 提取共享函数、跨类型提取泛型、重复 impl 收敛为 trait、match/错误处理提取宏、并行 struct 提取基类的分诊规则同时放过new()、From/Into与 derive 样板——最后以 before/after 形态输出重构建议就能把相似度扫描真正转化为可落地的代码质量改进。【免费下载链接】ccusagenpx ccusage项目地址: https://gitcode.com/gh_mirrors/cc/ccusage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考