cargo install 有等效的更新命令吗?

问题描述 投票:0回答:5

我使用

cargo install
全局安装软件包,例如 rustfmtracer

如何更新已安装的软件包,而不先删除它(

cargo uninstall
)然后再次运行
cargo install

有更新命令吗?

rust rust-cargo
5个回答
222
投票

原版中没有这样的命令

cargo
(嗯,有
cargo install
,但那是为了依赖),但由于
cargo
支持第三方子命令,所以有一个答案:
cargo-update
板条箱

照常安装

cargo install cargo-update

然后使用

cargo install-update -a

要更新所有已安装的软件包,有关更多使用信息和示例,请参阅

cargo install-update
手册页

免责声明:我是作者


98
投票

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

cargo install <crate>

这来自拉取请求#6798(添加安装升级),并在#7560(稳定安装升级)中稳定下来。

它是如何工作的?

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

强制升级/重新安装

以下命令将始终卸载、下载并编译最新版本的包 - 即使没有可用的更新版本。在正常情况下,应该首选

install-upgrade
功能,因为如果没有新版本的 crate,它确实可以节省时间和带宽。

cargo install --force <crate>

文档

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


30
投票

我找到的解决方案是将

--force
标志添加到安装命令中。例如
cargo install --force clippy
。这将有效地重新安装最新版本。


27
投票

这里是一个单行代码,用于更新所有已安装的 Cargo 板条箱(从本地文件夹安装的除外):

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

说明:

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

1
投票

我使用命令

cargo install --locked $(cat $CARGO_HOME/.crates2.json | jq -r '.installs | keys[] | split(" ")[0]')

您需要

jq
才能运行此命令。我使用 this 命令 来可靠地获取已安装的软件包。

请注意,我在这里使用了

--locked
。如果没有
--locked
,很少有构建可能会失败。例如,从今天开始,如果您使用
cargo install-update -a
,您将收到类似“无法更新 pueue,ripgrep_all”的消息。 (这里,将puueue、ripgrep_all替换为需要的包
--locked
)。

另一件事是,我们可能有一些依赖项来更新已安装的包。为此,我创建了一个函数,它首先获取依赖项,然后更新已安装的包。

这是 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

对于其他 shell,只有函数语法会改变,函数体保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.