cargo install 有对应的更新命令吗?

153

我使用 cargo install 全局安装包,例如 rustfmtracer

如何在不先删除已安装的包(cargo uninstall),再运行 cargo install 的情况下更新已安装的包。

是否有更新命令?


不行,你可以在这个问题中讨论。 - Vladimir Matveev
2
重新运行最初的 cargo install thing 将会导致其被更新。 - BallpointBen
1
@BallpointBen 是的,这就是所接受答案所指示的内容。 - Avindra Goolcharan
5个回答

208

在原版中没有这样的命令(好吧,有,但那是用于依赖项的),但由于支持第三方子命令,因此有一个答案:使用cargo-update crate

像往常一样安装即可。

cargo install cargo-update

然后使用

cargo install-update -a

要更新所有已安装的软件包,请参阅cargo install-update手册获取更多使用信息和示例。

免责声明:我是作者


3
非常感谢您提供这个实用工具!太棒了!这应该是被采纳的答案。 - Ben Sandeen
1
@BenSandeen 嗯,那就是一年后才回答的通用处理方式 v0v - набиячлэвэли
1
需要安装 cmake - rofrol
2
@rofrol,正如Manpage的安装部分所明确阐述的那样。 - набиячлэвэли
2
嗯,有 cargo install 但那是用来安装依赖的。实际上,现在可以使用 cargo install 来全局安装 crates:安装 Rust 二进制文件。默认位置为 $HOME/.cargo/bin - tmillr
显示剩余2条评论

90

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

cargo install <crate>

这是来自拉取请求#6798(添加install-upgrade),并已在#7560(稳定安装升级)中得到稳定。

它如何工作?

与其在检测到软件包已安装时失败,它将在版本不匹配时进行升级,或者如果被认为是“最新的”,则不执行任何操作(退出0)。

强制升级/重新安装

以下命令将始终卸载、下载和编译crate的最新版本——即使没有更新的版本可用。通常情况下,应优先选择install-upgrade功能,因为如果该crate没有新版本,则可以节省时间和带宽。

cargo install --force <crate>

文档

更多信息可在GitHub的问题 rust-lang/cargo#6797官方文档章节 中找到。


这是否也会在夜间编译它们? - Monstieur
1
这现在已经稳定,并且是默认行为。您不再需要使用 nightly 频道或提供 -Z install-upgrade 参数。https://github.com/rust-lang/cargo/pull/7560 - Rag
1
如果您希望更新所有软件包,只需使用一个简单的 shell 命令,例如 cargo install --list | grep '^[a-zA-Z0-9_\-]* v[0-9.]*:$' | cut -d ' ' -f1 | xargs cargo install 即可。 - Tom
在 Rust 1.55.0 中,自动升级似乎不是默认行为;我安装了 wasm-pack 0.10.0,但当我尝试使用 cargo install wasm-pack 将其更新到 0.10.1 时,出现了错误:error: binary 'wasm-pack' already exists in destination,我不得不使用 --force - Herohtar

30

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


3
在最近的 cargo 版本中,使用 --force 命令已经不再是更新 crate 的必要步骤了。 - David Bailey

27

这是一个一行命令,用于更新所有已安装的Cargo包,除了那些从本地文件夹安装的包:

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

说明:

  • 列出安装的包
  • 过滤包含软件包名称和版本的行,并排除其中的文件系统路径
  • 截取这些行,仅包括软件包名称
  • 使用得到的软件包名称运行cargo install

感谢您提供一个没有外部依赖的答案。 - ilyazub
3
cargo install $(cargo install --list | awk '/:$/ { print $1; }') - DexterHaxxor
如果您不介意高尔夫球的话,“cargo install --list | egrep -o '^[^ ]+'”更短一些,用于列出已安装的软件包。是否存在非缩进行而不是软件包的情况? - Tom Anderson

1
我使用这个命令
cargo install --locked $(cat $CARGO_HOME/.crates2.json | jq -r '.installs | keys[] | split(" ")[0]')

你需要使用jq来运行这个命令。我使用this command来可靠地获取已安装的软件包。
请注意,我在这里使用了--locked。如果没有--locked,可能会导致一些构建失败。例如,截至今天,如果你使用cargo install-update -a,你将收到类似"Failed to update pueue, ripgrep_all."的消息(在这里,用需要--locked的软件包替换pueue、ripgrep_all)。
另外一件事是,我们可能有一些依赖项需要更新已安装的软件包。为此,我编写了一个函数,它首先获取依赖项,然后更新已安装的软件包。
以下是适用于fish shell的示例函数。
function rust_update_packages
    # cargo install --locked ripgrep_all
    # cargo install --locked pueue
    # Alacritty Dependencies
    apt install -y cmake pkg-config libfreetype6-dev libfontconfig1-dev libxcb-xfixes0-dev libxkbcommon-dev python3
    cargo install --locked $(cat $CARGO_HOME/.crates2.json | jq -r '.installs | keys[] | split(" ")[0]')
end

对于其他的外壳,只有函数语法会改变,函数体将保持不变。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接