Rust自动更新库axoupdater的使用,axoupdater提供高效可靠的Rust应用程序自动更新功能
Rust自动更新库axoupdater的使用,axoupdater提供高效可靠的Rust应用程序自动更新功能
axoupdater是一个自动更新程序,设计用于与cargo-dist配合使用。它既可以作为独立程序使用,也可以作为库集成到您自己的程序中。它支持托管在GitHub Releases或Axo Releases(测试中)上的发布版本。
使用示例
首先展示内容中提供的示例代码:
- 检查更新并通知用户:
if AxoUpdater::new_for("axolotlsay").load_receipt()?.is_update_needed_sync()? {
eprintln!("axolotlsay is outdated; please upgrade!");
}
- 自动执行更新(同步版本):
if AxoUpdater::new_for("axolotlsay").load_receipt()?.run_sync()? {
eprintln!("Update installed!");
} else {
eprintln!("axolotlsay already up to date");
}
- 自动执行更新(异步版本):
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(())
}
构建独立二进制文件
要构建为独立二进制文件:
- 运行
cargo build --release
- 将
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);
// 这里可以添加错误处理逻辑
}
}
}
关键点说明
-
配置详解:
current_version
:必须与服务器上的版本信息匹配update_url
:指向包含版本信息和更新包的服务器端点target_dir
:指定应用程序的安装目录
-
更新策略:
- 支持立即更新或后台延迟更新
- 可配置静默模式(不显示任何UI)
-
进度回调:
- 提供检查、下载、安装等各个阶段的回调
- 下载进度包含百分比信息
-
错误处理:
- 应妥善处理网络错误、权限问题等
- 实际应用中建议添加重试机制
-
多平台支持:
- 代码在Windows、Linux和macOS上均可运行
- 注意处理各平台的权限差异
这个完整示例展示了如何在实际应用中使用axoupdater库实现自动更新功能,包含了从配置到执行的全流程。