self_update
provides updaters for updating rust executables in-place from various release
distribution backends.
self_update = "0.15"
Update (replace) the current executable with the latest release downloaded
from https://api.github.com/repos/jaemk/self_update/releases/latest
.
Note, the trust
project provides a nice setup for
producing release-builds via CI (travis/appveyor).
The following cargo features are available (but disabled by default):
archive-tar
: Support for tar archive format;archive-zip
: Support for zip archive format;compression-flate2
: Support for gzip compression;compression-zip-deflate
: Support for zip's deflate compression format;compression-zip-bzip2
: Support for zip's bzip2 compression format;rustls
: Use pure rust TLS implementation for network requests. This feature does not support 32bit macOS;
Please active the feature(s) needed by your release files.
use self_update::cargo_crate_version;
fn update() -> Result<(), Box<::std::error::Error>> {
let status = self_update::backends::github::Update::configure()
.repo_owner("jaemk")
.repo_name("self_update")
.bin_name("self_update_example")
.show_download_progress(true)
.current_version(cargo_crate_version!())
.build()?
.update()?;
println!("Update status: `{}`!", status.version());
Ok(())
}
Run the above example to see self_update
in action: cargo run --example github --features "archive-tar compression-flate2"
Amazon S3 is also supported as the backend to check for new releases. Provided a bucket_name
and asset_prefix
string, self_update
will look up all matching files using the following format
as a convention for the filenames: [directory/]<asset name>-<semver>-<platform/target>.<extension>
.
Leading directories will be stripped from the file name allowing the use of subdirectories in the S3 bucket,
and any file not matching the format, or not matching the provided prefix string, will be ignored.
use self_update::cargo_crate_version;
fn update() -> Result<(), Box<::std::error::Error>> {
let status = self_update::backends::s3::Update::configure()
.bucket_name("self_update_releases")
.asset_prefix("something/self_update")
.region("eu-west-2")
.bin_name("self_update_example")
.show_download_progress(true)
.current_version(cargo_crate_version!())
.build()?
.update()?;
println!("S3 Update status: `{}`!", status.version());
Ok(())
}
Separate utilities are also exposed (NOTE: the following example requires the archive-tar
feature,
see the features section above):
fn update() -> Result<(), Box<::std::error::Error>> {
let releases = self_update::backends::github::ReleaseList::configure()
.repo_owner("jaemk")
.repo_name("self_update")
.build()?
.fetch()?;
println!("found releases:");
println!("{:#?}\n", releases);
// get the first available release
let asset = releases[0]
.asset_for(&self_update::get_target()).unwrap();
let tmp_dir = self_update::TempDir::new_in(::std::env::current_dir()?, "self_update")?;
let tmp_tarball_path = tmp_dir.path().join(&asset.name);
let tmp_tarball = ::std::fs::File::open(&tmp_tarball_path)?;
self_update::Download::from_url(&asset.download_url)
.download_to(&tmp_tarball)?;
let bin_name = std::path::PathBuf::from("self_update_bin");
self_update::Extract::from_source(&tmp_tarball_path)
.archive(self_update::ArchiveKind::Tar(Some(self_update::Compression::Gz)))
.extract_file(&tmp_dir.path(), &bin_name)?;
let tmp_file = tmp_dir.path().join("replacement_tmp");
let bin_path = tmp_dir.path().join(bin_name);
self_update::Move::from_source(&bin_path)
.replace_using_temp(&tmp_file)
.to_dest(&::std::env::current_exe()?)?;
Ok(())
}
License: MIT