#deps #dependencies #git-checkout #udep

app undepend

尝试从您的 git 检出中删除依赖项。需要在干净的检出上工作。

2 个版本

0.1.1 2021 年 9 月 28 日
0.1.0 2021 年 9 月 12 日

#428 in Cargo 插件

MIT/Apache

16KB
295

undepend

undepend 通过删除可能的候选者并通过删除后检查是否仍然可以编译来强制删除依赖项。

结果是一个文件名为 unused.sh 的 crate 列表,可以删除。 chmod +x ./unused.sh 并运行它以删除所有未使用的依赖项,并查看结果是否适用于您。

或者您可以在 vscode 终端中 cat ./unused.sh 并使用 Cargo.toml 超链接手动检查那些 crate 是否应该被删除。

安装

(需要 git)

安装 undepend 和先决条件

cargo install ripgrep cargo-edit undepend

使用方法

将您的当前目录更改为新检出 git 克隆的目录并运行

undepend

该工具将遍历工作区的依赖项,逐个删除它们并确定是否仍然可以编译。

** 如果开始时检出不是干净的,则工具将中止。 **

已记录的依赖项列表将写入 unused.sh

undepend 的工作原理

使用 cargo metadata 理解工作区中哪些 crate。

对于每个 crate 我们运行

  • cargo rm a_crate_dep (来自 cargo-edit)
  • cargo检查 --所有目标
  • cargo构建 --所有目标 --发布
  • cargo测试 --文档 --发布不存在的测试名称
  • 如果我们到达这里而没有任何错误,那么这个依赖可能不是必需的。
  • git reset --hard (回到干净状态)

性能

作为一个优化,undepend 跳过了明显在源代码中使用的依赖项。因此,undepend 的运行时间不是太坏。(在优化之前,对于某些项目,它可能需要一整夜。现在我在 32 核机器上还没有看到任何项目需要超过 30 分钟。)

需要注意的问题

如果依赖项是非可选的,只用于一个目标平台并且没有直接使用,我们仍然可能会尝试删除它。

目前,cargo check --all-targets无法编译文档测试,所以我们尝试运行cargo test non_existent_test_name - 我认为这强制执行了编译。

(跟踪修复此问题的issue/PR:https://github.com/rust-lang/cargo/issues/6424 https://github.com/rust-lang/cargo/pull/8859

如果依赖项是可选的,则不会尝试删除它。

跳过

TODO:我们尝试尊重cargo-udeps忽略格式

[package.metadata.cargo-udeps.ignore]

(见Cargo.toml以获取示例)

奖杯柜

请参考此问题以添加到奖杯柜

https://github.com/gilescope/undepend/issues/1

现有技术

udeps

udeps采用了一种不那么暴力方法,即查看目标目录中的增量编译信息以基于其决策,因此更适合常规CI使用。

https://crates.io/crates/cargo-udeps

(与udeps相比,此crate只有纯Rust依赖。)

变更日志

  • 0.1.1 检查调试 + 发布模式和文档测试。还检查构建依赖项。
  • 0.1.0 初始版本

依赖项

~3–4MB
~80K SLoC