货物.toml 中的损坏!—Rust 包特性如何工作(及损坏)

  • cargo-semver-checks v0.37 新功能:可扫描 Cargo.toml 文件以检测破坏。文中以 my_crateCargo.toml 差异为例,展示看似无害的更改却可能导致用户构建错误。

    • Rust 包特性基础:Cargo 允许包携带可条件性启用和编译的功能,用户可选择启用或禁用。如通过 [features] 定义可选功能,下游用户可通过 features 字段选择启用。
    • 删除包特性是重大破坏变更:引用不存在的包特性会触发构建错误,删除以前存在的包特性是重大破坏变更,cargo-semver-checks 新版本可捕获此类情况。
    • 可选依赖(有时)创建隐式特性cargo 允许定义可选依赖,每个可选依赖会定义一个同名隐式特性,方便用户按需选择依赖,但也可能成为隐患,因为隐式特性并非总是创建。
    • Cargo.toml 中的破坏!:包特性可引用其他特性和可选依赖,若在 [features] 表中使用 dep: 前缀指定可选依赖,会禁用隐式特性,如示例中 max_performance 特性会移除 rayonrustc-hash 特性,cargo-semver-checks v0.37 可检测到此类破坏。
    • cargo-semver-checks 内部工作原理:构建此功能具有挑战性,cargo-semver-checks 以前依赖 rustdoc JSON,现在引入 cargo metadata 作为数据源,通过繁琐的重构和编织将其贯穿整个系统,先将元数据的数据模型表示为 Trustfall 查询引擎模式,再编写新的 lint 文件并添加测试用例。
  • 总结与呼吁:询问读者是否能发现文章开头 Cargo.toml 示例中的破坏,强调 cargo-semver-checks 可处理此类问题,呼吁读者订阅博客、关注社交媒体或通过 GitHub Sponsors 支持作者。同时提供讨论链接。
阅读 7
0 条评论