9 个版本
0.2.0 | 2023 年 8 月 6 日 |
---|---|
0.1.7 | 2022 年 7 月 17 日 |
#213 在 Cargo 插件
656 每月下载次数
125KB
1K SLoC
潜在未使用的已启用功能标志查找器和修剪器。
此 cargo 工具允许您查找和修剪项目中已启用但可能未使用的功能标志。
使用 unused-features --help
获取有关可用子命令及其配置的更多详细信息。
1. 使用方法
运行 cargo install cargo-unused-features
或下载库并自行构建。
- 步骤:分析已启用的未使用功能。
您可以通过提供 --bin, --lib, --examples, --benches, --tests
标志来控制编译。默认情况下,库和二进制文件将被编译。如果要在分析中编译测试、示例、基准测试,请确保提供相应的标签。
cd C:/some_path/
unused-features analyze
运行完成后,检查项目目录中的 report.json
并用于下一步。
- 生成 HTML 报告。(可选)
您可以从 json 生成简单的 HTML 报告,以便更容易地检查结果。
unused-features build-report --input "C:/some_path/report.json"
运行完成后,检查项目目录中的 report.html
。您可以选择手动修复依赖关系或使用下一步中的命令。
- 应用建议删除的功能标志。
可能自动应用第一个命令的发现结果。但请注意免责声明。
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. 报告错误
该工具非常新,可能会出现问题。如果您遇到问题,请按照以下步骤操作:
- 对出问题的
Cargo.toml
文件提交一个问题。 - 向
cargo-unused-features
命令提供--log debug
标志,并在问题中发布日志。
未来
找到更确切地知道何时可以删除功能的方法将非常棒。可能我们需要对依赖代码库中的功能进行一些正则表达式匹配,以查看功能的使用情况。然后,根据这些信息得出更精确的假设。如果您有想法,请随时提交问题或联系我!
依赖关系
~52MB
~1M SLoC