Does cargo install have an equivalent update command?

RustRust Cargo

Rust Problem Overview


I'd like to update a package that I used cargo install to globally install packages, such as rustfmt or racer. I can't find a way to update an installed package without first deleting it (via cargo uninstall) and then running the install command again. Is there an update command?

Rust Solutions


Solution 1 - Rust

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

Solution 2 - Rust

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).

How does it work?

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".

Forcing an upgrade / re-installation

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>
Documentation

Further information can be found in the GitHub issue rust-lang/cargo#6797 and in the official documentation chapter.

Solution 3 - Rust

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.

Solution 4 - Rust

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:

  • List installed packages
  • Filter to lines which contain package names and versions, and exclude ones with filesystem paths
  • Cut those lines to only include the package name
  • cargo install with the resulting package names

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionw.brianView Question on Stackoverflow
Solution 1 - RustнабиячлэвэлиView Answer on Stackoverflow
Solution 2 - RustNicolai FröhlichView Answer on Stackoverflow
Solution 3 - Rustw.brianView Answer on Stackoverflow
Solution 4 - RustDavid BaileyView Answer on Stackoverflow