Awesome
cargo-update
![Crates.io version](https://img.shields.io/crates/v/cargo-update)
A cargo
subcommand for checking and applying updates to installed executables
Documentation
Manual
Installation
Firstly, ensure you have CMake and the Required Libraries™.
Then proceed as usual:
cargo install cargo-update
If that doesn't work:
- re-try with
PKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfig
, - re-try with
LIBSSH2_SYS_USE_PKG_CONFIG=whatever
, - install OpenSSL via
brew
, and re-try withLDFLAGS="-L/usr/local/opt/openssl@1.1/lib" CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
, - verify that you don't
openssl
installed twice viabrew
, - re-try with
--features vendored-openssl
, - re-try with
--features vendored-libgit2
. - re-try with
--features vendored-libcurl
.
If it still doesn't work, slam open an issue or comment on one of the existing relevant ones.
Dependencies
Dependency | Debian package | Fedora package | MSYS2 package |
---|---|---|---|
libgit2 | libgit2-dev | libgit2-devel | mingw-w64-x86_64-libgit2 |
libcurl | libcurl4-*-dev | libcurl-devel | libcurl-devel |
libssh2 | libssh-dev | libssh2-devel | mingw-w64-x86_64-libssh2 |
openssl | libssl-dev | openssl-devel | mingw-w64-x86_64-openssl |
pkgconf (some platforms) | pkgconf | pkgconf | mingw-w64-x86_64-pkgconf |
Usage
cargo install-update -a
— check for newer versions and update all installed packages.
cargo install-update crate1 crate2 ...
— check for newer versions and update selected packages, will not install new packages.
For more information and examples see the manual.
cargo install-update-config -t unstable -f feature1 -d false crate
— when building crate, do so with the unstable toolchain with feature1 and no default features.
For more information and examples see the manual.
Self-update
cargo-update
will update itself seamlessly on Linux and Windows.
On Windows the following strategy is applied:
- Check for old versions, remove them
- Add the current version to the current executable's extension
- Create an empty file in place of the just-renamed file (this way
cargo install
will "replace" it and not duplicate the entry in.crates.toml
)
Troubleshooting
Some crates, like clippy
and rustfmt
, have moved from Crates.io to being a rustup
component.
If you'd installed them beforehand, then added them via rustup component
, they might not have been removed from the list of crates installed via cargo install
,
and you might come across errors such as
$ cargo install-update -a
Updating registry 'https://github.com/rust-lang/crates.io-index'
Package Installed Latest Needs update
clippy v0.0.179 v0.0.302 Yes
.....
Updating clippy
Updating crates.io index
Installing clippy v0.0.302
Compiling clippy v0.0.302
error: failed to compile `clippy v0.0.302`, intermediate artifacts can be found at `/tmp/cargo-installxHfj2y`
Caused by:
failed to run custom build command for `clippy v0.0.302`
Caused by:
process didn't exit successfully: `/tmp/cargo-installxHfj2y/release/build/clippy-ffeedc2f188020a4/build-script-build` (exit code: 1)
--- stderr
error: Clippy is no longer available via crates.io
help: please run `rustup component add clippy-preview` instead
In that case, run cargo install --list
to verify that they're still there and cargo uninstall
them,
which will deregister the cargo
versions and leave you with the rustup
ones.
Bleeding-edge cargo
s
Since 0.42.0
,
cargo install cratename
checks for newer versions and installs them if they exist, instead of erroring out like it does usually.
Source Replacement vs custom registries
Cargo allows replacing entire registries at a time.
For example, this stanza in ~/.cargo/config
will replace the default crates.io registry with the Shanghai Jiao Tong Universty's mirror:
[source.crates-io]
replace-with = "sjtu"
[source.sjtu]
registry = "https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index"
cargo-update
resolves this to the deepest registry, and passes --registry sjtu
to cargo install
.
This worked until roughly nightly-2019-08-10
, but since nightly-2019-09-10
due to a Cargo regression (or feature, but it's breaking without a major version bump, so)
--registry
looks into a different key, requiring this additional stanza to ensure correct updates:
[registries.sjtu]
index = "https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index"
Confer the initial implementation, rewrite, final broken testcase and final debug implementation threads (h/t @DCJanus for help debugging and testcases, also dealing with me as I slowly spiraled into insanity).
Special thanks
To all who support further development on Patreon, in particular:
- ThePhD
- Embark Studios
- Lars Strojny
- EvModder