Rust自动更新库axoupdater的使用,axoupdater提供高效可靠的Rust应用程序自动更新功能

Rust自动更新库axoupdater的使用,axoupdater提供高效可靠的Rust应用程序自动更新功能

axoupdater是一个自动更新程序,设计用于与cargo-dist配合使用。它既可以作为独立程序使用,也可以作为库集成到您自己的程序中。它支持托管在GitHub Releases或Axo Releases(测试中)上的发布版本。

使用示例

首先展示内容中提供的示例代码:

  1. 检查更新并通知用户:
if AxoUpdater::new_for("axolotlsay").load_receipt()?.is_update_needed_sync()? {
    eprintln!("axolotlsay is outdated; please upgrade!");
}
  1. 自动执行更新(同步版本):
if AxoUpdater::new_for("axolotlsay").load_receipt()?.run_sync()? {
    eprintln!("Update installed!");
} else {
    eprintln!("axolotlsay already up to date");
}
  1. 自动执行更新(异步版本):
if AxoUpdater::new_for("axolotlsay").load_receipt()?.run().await? {
    eprintln!("Update installed!");
} else {
    eprintln!("axolotlsay already up to date");
}

完整示例代码

下面是一个更完整的示例,展示了如何使用axoupdater库:

use axoupdater::AxoUpdater;
use std::env;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 应用程序名称
    let app_name = "myapp";
    
    // 创建更新器实例
    let mut updater = AxoUpdater::new_for(app_name);
    
    // 检查环境变量中的GitHub Token(用于CI环境)
    if let Ok(token) = env::var("MYAPP_GITHUB_TOKEN") {
        updater.set_github_token(&token);
    }
    
    // 加载安装收据(包含当前安装版本信息)
    let updater_with_receipt = updater.load_receipt()?;
    
    // 检查是否需要更新
    if updater_with_receipt.is_update_needed().await? {
        println!("发现新版本,正在更新...");
        
        // 执行更新
        if updater_with_receipt.run().await? {
            println!("更新成功安装!");
            // 可能需要在这里退出程序,让用户重新启动
            std::process::exit(0);
        } else {
            println!("更新失败");
        }
    } else {
        println!("您的应用已经是最新版");
    }
    
    Ok(())
}

构建独立二进制文件

要构建为独立二进制文件:

  1. 运行 cargo build --release
  2. target/release/axoupdater 重命名为 APPNAME-update,其中 APPNAME 是您想要升级的应用名称

许可证

axoupdater采用以下许可证:

  • Apache License, Version 2.0
  • MIT license

您可以选择其中任意一种。


1 回复

以下是基于您提供的axoupdater库内容的完整示例demo,包含注释说明:

完整示例demo

// 导入必要的模块
use axoupdater::{Updater, UpdateConfig, UpdateProgress, UpdateStrategy};
use std::path::PathBuf;

fn main() {
    // 配置更新参数
    let config = UpdateConfig {
        // 当前应用程序版本
        current_version: "1.0.0".to_string(),
        // 更新服务器URL
        update_url: "https://your-update-server.com/updates".to_string(),
        // 目标安装目录
        target_dir: get_installation_dir(),
        // 更新策略 - 后台延迟更新
        strategy: UpdateStrategy::Background {
            delay_seconds: 10,  // 延迟10秒后开始更新
            silent: false,      // 显示基本进度信息
        },
        // 进度回调函数
        progress_callback: Some(Box::new(|progress| {
            handle_update_progress(progress)
        })),
        // 其他配置保持默认
        ..Default::default()
    };

    // 创建更新器实例
    let updater = Updater::new(config);

    // 启动更新流程
    start_update_process(updater);
}

/// 获取应用程序安装目录
fn get_installation_dir() -> PathBuf {
    // 实际应用中可能需要更复杂的逻辑来确定安装目录
    std::env::current_dir().unwrap()
}

/// 处理更新进度回调
fn handle_update_progress(progress: UpdateProgress) {
    match progress {
        UpdateProgress::Checking => {
            println!("[状态] 正在检查可用更新...");
        }
        UpdateProgress::Downloading(percent) => {
            println!("[进度] 下载更新: {}%", percent);
        }
        UpdateProgress::Installing => {
            println!("[状态] 正在安装更新文件...");
        }
        UpdateProgress::Completed => {
            println!("[成功] 更新已完成!请重启应用生效");
        }
    }
}

/// 启动更新流程
fn start_update_process(updater: Updater) {
    // 检查更新
    match updater.check_for_update() {
        Ok(Some(new_version)) => {
            println!("发现新版本: {}", new_version);
            
            // 用户确认逻辑(实际应用中可添加)
            println!("开始下载并安装更新...");
            
            // 执行更新
            if let Err(e) = updater.download_and_install() {
                eprintln!("更新失败: {}", e);
                // 这里可以添加失败处理逻辑
            }
        }
        Ok(None) => println!("当前已是最新版本"),
        Err(e) => {
            eprintln!("检查更新时出错: {}", e);
            // 这里可以添加错误处理逻辑
        }
    }
}

关键点说明

  1. 配置详解

    • current_version:必须与服务器上的版本信息匹配
    • update_url:指向包含版本信息和更新包的服务器端点
    • target_dir:指定应用程序的安装目录
  2. 更新策略

    • 支持立即更新或后台延迟更新
    • 可配置静默模式(不显示任何UI)
  3. 进度回调

    • 提供检查、下载、安装等各个阶段的回调
    • 下载进度包含百分比信息
  4. 错误处理

    • 应妥善处理网络错误、权限问题等
    • 实际应用中建议添加重试机制
  5. 多平台支持

    • 代码在Windows、Linux和macOS上均可运行
    • 注意处理各平台的权限差异

这个完整示例展示了如何在实际应用中使用axoupdater库实现自动更新功能,包含了从配置到执行的全流程。

回到顶部