Reputation: 17397
I used cargo install
to globally install a package, such as rustfmt or racer.
How can I update the installed package without first deleting it ( cargo uninstall
) and then running cargo install
again.
Is there an update command?
Upvotes: 187
Views: 68609
Reputation: 1
Without any unexpected error if there are no crates installed.
Use:
cargo install --list | grep -E '^[a-z0-9_-]+ v[0-9.]+:$' | cut -f1 -d' ' | xargs cargo install
Upvotes: 0
Reputation: 17397
A solution I've found is to add the --force
flag to the install command. For example cargo install --force clippy
. This will effectively re-install the latest version.
⚠️ NOTE: Using the --force
parameter is no longer necessary in newer versions of the cargo
CLI.
Upvotes: 30
Reputation: 4677
There is no such command in vanilla cargo
(well, there's cargo install
but that's for dependencies), but since cargo
supports third-party subcommands there is an answer: the cargo-update
crate.
Install as usual with
cargo install cargo-update
then use
cargo install-update -a
to update all installed packages, for more usage information and examples see the cargo install-update
manpage.
Disclaimer: am author
Upvotes: 251
Reputation: 13862
I use the command
cargo install --locked $(cat $CARGO_HOME/.crates2.json | jq -r '.installs | keys[] | split(" ")[0]')
You need jq
to run this command. I use this command to reliably get the installed packages.
Please note that i have used --locked
here. Without --locked
few builds may fail. For example, as of today, if you use cargo install-update -a
, you will get a message like "Failed to update pueue, ripgrep_all." (Here, replace pueue, ripgrep_all with packages that need --locked
).
Another thing is, we may have some dependencies to update the installed package. For that i made a function which will first get the dependencies then update the installed package.
Here is a sample function for 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
For other shell, only the function syntax will change, the body of the function will remain same.
Upvotes: 1
Reputation: 1091
Here is a one-liner to update all installed Cargo crates, except those installed from a local folder:
cargo install $(cargo install --list | egrep '^[a-z0-9_-]+ v[0-9.]+:$' | cut -f1 -d' ')
Explanation:
cargo install
with the resulting package namesUpvotes: 33
Reputation: 52493
As of Rust 1.41.0, you can use the following command to update crates to their latest version:
cargo install <crate>
This came from pull request #6798 (Add install-upgrade) and was stabilized in #7560 (Stabilize install-upgrade).
Instead of failing when cargo install
detects a package is already installed, it will upgrade if the versions don't match, or do nothing (exit 0) if it is considered "up-to-date".
The following command will always uninstall, download and compile the latest version of the crate - even if there's no newer version available. Under normal circumstances the install-upgrade
feature should be preferred as it does save time and bandwidth if there's no new version of the crate.
cargo install --force <crate>
Further information can be found in the GitHub issue rust-lang/cargo#6797 and in the official documentation chapter.
Upvotes: 110