我使用
cargo install
全局安装软件包,例如 rustfmt 或 racer。
如何更新已安装的软件包,而不先删除它(
cargo uninstall
)然后再次运行cargo install
。
有更新命令吗?
原版中没有这样的命令
cargo
(嗯,有cargo install
,但那是为了依赖),但由于cargo
支持第三方子命令,所以有一个答案:cargo-update
板条箱。
照常安装
cargo install cargo-update
然后使用
cargo install-update -a
cargo install-update
手册页。
免责声明:我是作者
从 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 和 官方文档章节中找到。
我找到的解决方案是将
--force
标志添加到安装命令中。例如cargo install --force clippy
。这将有效地重新安装最新版本。
这里是一个单行代码,用于更新所有已安装的 Cargo 板条箱(从本地文件夹安装的除外):
cargo install $(cargo install --list | egrep '^[a-z0-9_-]+ v[0-9.]+:$' | cut -f1 -d' ')
说明:
cargo install
以及生成的包名称我使用命令
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,只有函数语法会改变,函数体保持不变。