2个不稳定版本
0.38.0 | 2023年4月3日 |
---|---|
0.37.0 | 2023年4月3日 |
442在压缩中排名
每月下载28次
155KB
3.5K SLoC
self_update
分支以移除SSL验证。
self_update
提供了更新Rust可执行文件的工具,可以从各种发布版本后端进行原地更新。
用法
更新(替换)当前可执行文件,使用从https://api.github.com/repos/jaemk/self_update/releases/latest
下载的最新版本。注意,trust
项目提供了一个通过CI(travis/appveyor)生成发布构建的便捷设置。
特性
以下Cargo特性可用(但默认为禁用):
archive-tar
:支持tar归档格式;archive-zip
:支持zip归档格式;compression-flate2
:支持gzip压缩;compression-zip-deflate
:支持zip的deflate压缩格式;compression-zip-bzip2
:支持zip的bzip2压缩格式;rustls
:使用纯Rust TLS实现进行网络请求。此特性不支持32位macOS;
请根据您的发布文件激活所需的特性。
示例
运行以下示例以查看self_update
的使用情况
cargorun --examplegithub --features "archive-tar archive-zip compression-flate2 compression-zip-deflate"
.
还有一个等效的gitlab示例
cargorun --examplegitlab --features "archive-tar archive-zip compression-flate2 compression-zip-deflate"
.
它运行的内容大致相当于
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("github")
.show_download_progress(true)
.current_version(cargo_crate_version!())
.build()?
.update()?;
println!("Update status: `{}`!", status.version());
Ok(())
}
Amazon S3、Google GCS 和 DigitalOcean Spaces 也通过 S3
后端支持,用于检查新版本。提供一个 bucket_name
和 asset_prefix
字符串,self_update
将使用以下格式作为文件名的约定来查找所有匹配的文件:[目录/]<资产名称>-<semver>-<平台/目标>.<扩展名>
。将删除文件名中的前缀目录,允许在 S3 存储桶中使用子目录,任何不匹配此格式或不匹配提供的前缀字符串的文件将被忽略。
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(())
}
还公开了独立的实用工具(注意:以下示例 需要 archive-tar
功能,请参阅上面功能部分)
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 = tempfile::Builder::new()
.prefix("self_update")
.tempdir_in(::std::env::current_dir()?)?;
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)
.set_header(reqwest::header::ACCEPT, "application/octet-stream".parse()?)
.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(())
}
许可证:MIT
依赖项
~13–28MB
~449K SLoC