#更新 #下载 #发布 #升级 #tar归档 #归档格式 #zip归档

self_update_danger_no_ssl_verify

独立可执行文件的自动更新。最初由jaemk创建,这个版本已移除SSL验证。

2个不稳定版本

0.38.0 2023年4月3日
0.37.0 2023年4月3日

442压缩中排名

每月下载28

MIT许可证

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:支持zipdeflate压缩格式;
  • compression-zip-bzip2:支持zipbzip2压缩格式;
  • 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_nameasset_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