cargo install 是否有等效的更新命令?

Does cargo install have an equivalent update command?

我想更新一个包,我用 cargo install 全局安装包,例如 rustfmt 或 racer。如果不先删除已安装的软件包(通过 cargo uninstall)然后再次 运行 安装命令,我找不到更新已安装软件包的方法。有更新命令吗?

vanilla cargo 中没有这样的命令(好吧,有 cargo install 但那是为了依赖),但是因为 cargo 支持 third-party subcommands there is an answer: the cargo-update crate.

像往常一样使用 cargo install cargo-update 安装,然后使用 cargo install-update -a 更新所有已安装的软件包,有关更多使用信息和示例,请参阅 cargo install-update manpage.

免责声明:我是作者

我找到的一个解决方案是在安装命令中添加 --force 标志。例如 cargo install --force clippy。这将有效地重新安装最新版本。

从 Rust 1.41.0 开始,您可以使用以下命令将 crates 更新到最新版本:

cargo install <crate>

这来自拉取请求 #6798 (Add install-upgrade) and was stabilized in #7560 (Stabilize install-upgrade)

它是如何工作的?

cargo install 检测到软件包已安装时,它不会失败,如果版本不匹配,它将升级,或者如果被认为是“up-to-date”,则不执行任何操作(退出 0) .

强制升级/re-installation

以下命令将始终卸载、下载和编译最新版本的 crate - 即使没有可用的更新版本。在正常情况下,应该首选 install-upgrade 功能,因为如果没有新版本的箱子,它确实可以节省时间和带宽。

cargo install --force <crate>

文档

可以在 GitHub 问题 rust-lang/cargo#6797 and in the official documentation chapter 中找到更多信息。

这是更新所有已安装的 Cargo crate 的单行代码,除了从本地文件夹安装的那些:

cargo install $(cargo install --list | egrep '^[a-z0-9_-]+ v[0-9.]+:$' | cut -f1 -d' ')

解释:

  • 列出已安装的软件包
  • 过滤包含包名称和版本的行,并排除包含文件系统路径的行
  • 删减这些行以仅包含包名称
  • cargo install 以及生成的包名称