#features #prune #cargo #remove #cli

app cargo-unused-features

查找未使用的已启用功能标志并修剪它们

9 个版本

0.2.0 2023 年 8 月 6 日
0.1.7 2022 年 7 月 17 日

#213Cargo 插件

Download history 51/week @ 2024-03-13 29/week @ 2024-03-20 21/week @ 2024-03-27 42/week @ 2024-04-03 82/week @ 2024-04-10 21/week @ 2024-04-17 30/week @ 2024-04-24 20/week @ 2024-05-01 20/week @ 2024-05-08 82/week @ 2024-05-15 123/week @ 2024-05-22 143/week @ 2024-05-29 150/week @ 2024-06-05 201/week @ 2024-06-12 128/week @ 2024-06-19 117/week @ 2024-06-26

656 每月下载次数

MIT 许可证

125KB
1K SLoC

Donate Latest Version MIT docs

潜在未使用的已启用功能标志查找器和修剪器。

此 cargo 工具允许您查找和修剪项目中已启用但可能未使用的功能标志。

使用 unused-features --help 获取有关可用子命令及其配置的更多详细信息。

1. 使用方法

运行 cargo install cargo-unused-features 或下载库并自行构建。

  1. 步骤:分析已启用的未使用功能。

您可以通过提供 --bin, --lib, --examples, --benches, --tests 标志来控制编译。默认情况下,库和二进制文件将被编译。如果要在分析中编译测试、示例、基准测试,请确保提供相应的标签。

cd C:/some_path/
unused-features analyze

运行完成后,检查项目目录中的 report.json 并用于下一步。

  1. 生成 HTML 报告。(可选)

您可以从 json 生成简单的 HTML 报告,以便更容易地检查结果。

unused-features build-report --input "C:/some_path/report.json"

运行完成后,检查项目目录中的 report.html。您可以选择手动修复依赖关系或使用下一步中的命令。

  1. 应用建议删除的功能标志。

可能自动应用第一个命令的发现结果。但请注意免责声明

unused-features prune --input "C:/some_path/report.json"

2. 工作原理

此库适用于工作空间和单个 crate。在工作空间上下文中,它将遍历工作空间定义中的每个 crate 并运行与单个 crate 相同的过程。

对于一个单独的crate,它将移除一个依赖项的功能,然后编译项目以查看是否仍然可以编译。如果可以,则可以可能地移除功能标志,但这可能是一个错误肯定(免责声明)。是的,为每个功能标志重新编译意味着一些开销。然而,这是一次性的事情,如果你有一个大型项目,只需让它运行一段时间。我个人在一个包含超过50个crate的项目上运行过,它在不到一个小时的时间内就完成了。编译器不会执行完全的清洁重建,这对我们有利。

此外,这个库使用 cargo_toml 来移除或添加功能。它将TOML文件加载到内存中,修改依赖项功能,序列化Manifest,并将其写回到toml文件中。然后它开始编译,在它运行完成后,原始内容将被写回,就像什么都没发生过一样。

但在做所有这些之前,我们需要知道在第一种情况下要移除哪些功能。这个库使用 cargo-metadata 来收集所有依赖项中启用的功能。功能可以通过几种方式启用。通过手动设置features = ['x', 'y']标签,或者通过default-features=false/true标签。此外,功能还可以启用0-n个其他功能,例如default=[x,y]。因此,这个库收集了所有启用的功能,无论是隐式还是显式启用的。收集完一个依赖项的所有启用功能后,它将逐个移除它们,并按照上述方式编译项目。

在这个过程中,为每个crate更新了一个json报告,以确保如果它崩溃,进度不会丢失。使用cargo unused-features build-report命令来可视化这个报告。

最后,这个库还有一个选项,可以通过运行cargo unused-features prune命令来自动应用所有建议。为此任务,使用toml-edit,因为它不会破坏TOML文件的格式、注释和空格。

3. 需要注意的事项

  • 有时功能标志可以在不破坏编译的情况下打开和关闭逻辑,因此这个工具可以将功能标志标记为可移除的,但本质上它会改变库的内部逻辑。因此,这个库提供了3个阶段:分析、自动应用建议和生成报告。如果你想要更仔细地检查HTML报告,以更清楚地了解给出的建议,并手动更新依赖项。
  • 给定crate A和B,B依赖于A并使用A中隐藏在功能标志背后的依赖项的逻辑,但A本身并不使用这段代码。在这种情况下,可以移除A的功能标志,但不能移除B的功能标志。因此,这可能会导致错误肯定。我建议逐个crate检查建议,或者只是在整个工作空间上运行它,通过添加已移除的功能来解决编译错误。
  • 功能标志只能用于特定的目标操作系统。本项目不针对每个目标编译,而是可以通过向--target x命令指定目标,例如使用cargo unused-features

4. 报告错误

该工具非常新,可能会出现问题。如果您遇到问题,请按照以下步骤操作:

  1. 对出问题的Cargo.toml文件提交一个问题。
  2. cargo-unused-features命令提供--log debug标志,并在问题中发布日志。

未来

找到更确切地知道何时可以删除功能的方法将非常棒。可能我们需要对依赖代码库中的功能进行一些正则表达式匹配,以查看功能的使用情况。然后,根据这些信息得出更精确的假设。如果您有想法,请随时提交问题或联系我!

依赖关系

~52MB
~1M SLoC