“cargo install”存在,但“cargo update”却没有?每个Rust开发者都熟悉的痛点
\n\n你刚刚运行了cargo install ripgrep来获取最新的rg二进制文件。一周过去了。你听说新版本发布了——14.1.0替代了13.0.0。这时一个合理的问题出现了:“Does cargo install have an equivalent update command?”
这个问题在Stack Overflow上获得了数千次浏览。这并非没有道理。原因在于,cargo中没有内置的cargo install update命令。不,你没看错。确实没有。但这并不意味着你只能手动下载新版本。有几种方法,我们将逐一介绍——从简单到优雅。
在本文中,我们不仅仅是翻译Stack Overflow上的答案。我们将比较各种方法,展示实际代码,并提供可操作的建议。开始吧!
\n\n为什么Cargo没有用于已安装crate的“update”命令?
\n\n在急于寻找错误之前,让我们先理解其理念。cargo install旨在安装二进制crate(那些在Cargo.toml中有[[bin]]部分的crate)。它不像apt或npm那样的包管理器。Cargo首先是项目的构建器和依赖管理器,而不是全局软件安装程序。
cargo update命令确实存在,但它在项目内部工作——更新Cargo.lock中的依赖项。对于全局安装的二进制文件,需要其他解决方案。
方法#1:经典重装(cargo install --force)
\n\n最简单直接的方法是使用--force标志重新安装crate:
# 第一次安装\ncargo install ripgrep\n\n# 一周后——更新\ncargo install --force ripgrep\n\n\n底层发生了什么?Cargo从crates.io下载最新版本的crate,重新编译并替换二进制文件。--force标志强制覆盖现有文件,即使版本相同。
优点:
\n- \n
- 无需安装额外工具 \n
- 始终有效,随处可用 \n
- 直观易懂 \n
缺点:
\n- \n
- 每次完全重新编译(如果crate很大,会很慢) \n
- 不检查是否有新版本——你只是重新安装 \n
- 如果你安装了10个以上的crate,会很不方便 \n
这就像为了更新驱动程序而重装Windows。有效吗?是的。最优吗?不是。
\n\n方法#2:cargo-outdated——智能的过时crate检测器
\n\n如果你想确切知道是否需要更新,请安装cargo-outdated:
cargo install cargo-outdated\n\n\n现在检查哪些crate已过时:
\n\ncargo outdated --root ~/.cargo\n\n\n输出将显示类似以下内容:
\n\nPackage Current Latest Deps\nripgrep 13.0.0 14.1.0 -\nbat 0.22.1 0.23.0 -\n\n\n然后你可以通过cargo install --force更新特定的crate。但这仍然是两步操作。想要自动化?请继续阅读。
优点:
\n- \n
- 仅显示确实过时的crate \n
- 也适用于项目的依赖项 \n
- 有过滤选项 \n
缺点:
\n- \n
- 不自行更新——仅提供信息 \n
- 需要单独安装 \n
方法#3:cargo-update(是的,确实有这样一个crate!)
\n\n对问题“Does cargo install have an equivalent update command?”最优雅的回答是——