内容提要
这篇文章总结了过去6周在Cargo开发中的重要事件,包括插件开发、cargo new命令改进、cargo upgrade合并、cargo update改进、cargo metadata稳定化等。还讨论了调试构建时避免性能问题和处理依赖关系中的回退依赖等设计问题。
延伸解读
cargo new 的体验优化
cargo new 命令在近期版本中增加了工作区检测和字段继承功能,并修复了排除成员的问题。此外,将提示信息从注释改为 note,并调整了输出顺序,从“Created”改为“Creating”,使输出更符合用户认知。这些改进旨在减少新用户的困惑,同时避免给老用户带来不必要的样板代码。
cargo update 的功能增强
cargo upgrade 被合并到 cargo update 中,目前专注于不兼容的升级。cargo update 增加了对落后依赖的高亮显示,并计划添加 --breaking 标志和扩展 --precise 以修改版本要求。此外,还实现了对 yanked 包的选择支持,但仍在测试中,未来可能进一步调整优先级。
调试构建性能问题的讨论
许多新用户会直接对调试构建进行基准测试,导致性能结果不佳。Cargo 团队正在讨论如何减少这种意外,例如要求指定 --profile、调整状态行文本、添加样式或表情符号、支持按命令设置默认 profile 等。这些方案需要权衡向后兼容性和不同用户的需求。
依赖解析与 MSRV 的改进
RFC #3537 提议在选择依赖时尊重最低支持 Rust 版本(MSRV),并可能通过 package.resolver 字段控制默认行为。同时,讨论了回退依赖的实现,以更好地支持可选依赖,例如通过 cfg 条件或构建脚本请求特性,但这些方案在实现和算法上存在复杂性。
Q&A
Cargo 1.77 开发周期中,cargo new 命令有哪些改进?
cargo new 增加了对工作区的检测和字段继承功能,并修复了字段继承未考虑工作区成员排除的问题。此外,将提示信息从注释改为 note,并调整了输出顺序,从打印 Created 状态改为在开始时打印 Creating 状态。
cargo upgrade 合并到 cargo update 后,目前专注于什么?
目前专注于不兼容的升级,即添加 --breaking 标志和扩展 --precise <breaking> 以修改版本要求。其他情况下的版本要求修改暂不考虑。
cargo update 命令在 1.77 周期增加了什么新功能?
增加了对落后依赖的高亮显示,这提供了 cargo-outdated 的一个子集功能给所有 cargo 用户。
cargo metadata 的 id 字段稳定化后,还扩展到了哪个命令?
扩展到了 cargo build --message-format=json,以确保两者的输出可以互操作,并添加了测试来验证。
为什么在调试构建时用户可能会遇到性能问题?Cargo 团队如何解决?
因为默认的 dev 配置文件优化了快速反馈和调试,但未优化性能,用户可能意外地基准测试了未优化的代码。团队正在讨论解决方案,如要求指定 --profile、调整状态行文本、添加 emoji 或样式、支持按命令默认配置文件等。
RFC #3537 提议 Cargo 在什么情况下尊重最低支持 Rust 版本(MSRV)?
提议在选择依赖时尊重 MSRV,即解析器在解析依赖时考虑包的 MSRV,以避免选择不兼容的依赖版本。
什么是回退依赖?Cargo 团队讨论了哪些实现方案?
回退依赖允许在可选依赖未启用时使用备用实现。讨论的方案包括支持 target."cfg(not(feature = "miniz_oxide"))".dependencies,但实现复杂且可能引起循环;或通过 build.rs 请求启用特性,但存在算法复杂性和解析分歧问题。
Cargo 和 rustup 集成时遇到了什么问题?可能的解决方案是什么?
问题:cargo install --path <foo> 期望使用 <foo> 处的 rust-toolchain.toml,但实际使用当前目录的。解决方案:可能为 rust-toolchain.toml 添加类似 .cargo/config.toml 的例外,但需谨慎处理工具链隔离和版本兼容性。第一步可能是提供警告。