#features #remove #prune #cargo #cli

app cargo-prune-features

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

1 个不稳定版本

0.0.0 2022年7月14日

#14#prune

MIT 许可证

19KB

Donate Latest Version MIT docs

未使用的已启用功能标志修剪器。

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

本库中有三个子命令

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

如何使用

运行 cargo install purge-features 或下载二进制文件并自行构建。

  1. 步骤 分析已启用未使用功能。
cargo purge-features analyze --workspace "C:/some_path/to/project" --report "C:/some_path/to/project/report.json"

运行完成后,检查 report.json 并用于下一步。

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

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

cargo purge-features build-report --input "C:/some_path/to/project/report.json" --output "C:/some_path/to/project/report.html"

您可以选择手动修复依赖项或使用下一步中的命令。

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

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

cargo purge-features purge --input "C:/some_path/to/project/report.json"

工作原理

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

对于单个包,它删除依赖项的功能,然后编译项目以查看是否仍然可以编译。如果可以,我们可以“相信”该功能可以被删除。是的,这表示为每个功能标志启用而重新编译项目的开销。然而,这是一次性的,如果您有一个大型项目,只需让它运行一段时间即可。但是,编译器不会执行完整的干净重建,这对我们有利。

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

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

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

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

注意事项

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

报告错误

这个工具非常新,可以预见会有问题。如果您有问题,请针对有问题的Cargo.toml文件打开一个问题。这样我可以快速调试排列过程。

无运行时依赖