golang实现应用程序自动更新功能的插件库go-rocket-update的使用
go-rocket-update: 构建自更新Go程序
go-rocket-update是一个让Golang应用程序能够轻松安全地实现自我更新的库。
主要特性
- 灵活的更新方式(例如使用Github或Gitlab)
- 跨平台支持(Mac、Linux、Arm和Windows)
- RSA签名验证
- 生成和验证签名的工具
- 后台更新
- 回滚功能
- 无外部依赖
快速入门
安装库
go get -u github.com/mouuff/go-rocket-update/...
让你的应用实现自更新
以下是一个使用Github releases的示例:
package main
import (
"fmt"
"log"
"runtime"
"github.com/mouuff/go-rocket-update/pkg/provider"
"github.com/mouuff/go-rocket-update/pkg/updater"
)
func main() {
// 创建更新器实例
u := &updater.Updater{
Provider: &provider.Github{
RepositoryURL: "github.com/mouuff/go-rocket-update-example", // 仓库地址
ArchiveName: fmt.Sprintf("binaries_%s.zip", runtime.GOOS), // 根据操作系统获取对应的zip包
},
ExecutableName: fmt.Sprintf("go-rocket-update-example_%s_%s", runtime.GOOS, runtime.GOARCH), // 可执行文件名
Version: "v0.0.1", // 当前版本
}
// 执行更新
if _, err := u.Update(); err != nil {
log.Println(err)
}
}
推送更新
更新器使用Provider
作为更新源输入。它提供文件和版本给更新器。
以下是几种提供者的例子:
provider.Github
: 检查Github上带有特定归档名(zip或tar.gz)的最新releaseprovider.Gitlab
: 检查Gitlab上带有特定归档名(zip或tar.gz)的最新releaseprovider.Local
: 使用本地文件夹,版本在VERSION文件中定义provider.Zip
: 使用zip
文件,版本由文件名定义provider.Gzip
: 与provider.Zip
类似,但使用tar.gz
文件
更新器将以相同的方式为所有提供者列出文件并检索它们。
目录应包含带有ExecutableName
的文件。例如:
test_windows_amd64.exe
test_darwin_amd64
test_linux_arm
我们推荐使用goxc为多个平台编译你的Go应用程序。
重要注意事项
- 要更新二进制文件,你必须对安装它的文件夹有适当的权限。例如,如果二进制文件位于"Program Files"等文件夹中,则过程将需要管理员权限。
计划中的功能
- 更多文档和示例
- 变量模板
- 多个提供者(如果第一个提供者不可用,可以使用另一个提供者)
- Github提供者的更新通道(alpha、beta等)
- 验证正在安装的可执行文件
更多关于golang实现应用程序自动更新功能的插件库go-rocket-update的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang实现应用程序自动更新功能的插件库go-rocket-update的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go-rocket-update: Golang应用程序自动更新插件库
go-rocket-update 是一个用于实现Golang应用程序自动更新的轻量级库。它提供了简单易用的API,可以帮助开发者轻松实现应用程序的自动更新功能。
主要特性
- 支持HTTP/HTTPS协议下载更新
- 支持增量更新和全量更新
- 支持版本检查
- 支持更新进度回调
- 跨平台支持
安装
go get github.com/go-rocket/update
基本使用示例
1. 简单更新检查
package main
import (
"fmt"
"github.com/go-rocket/update"
)
func main() {
// 创建更新器
updater := update.NewUpdater(
"https://your-update-server.com/updates",
"1.0.0", // 当前版本
)
// 检查更新
latest, err := updater.CheckForUpdate()
if err != nil {
fmt.Printf("检查更新失败: %v\n", err)
return
}
if latest.Version == updater.CurrentVersion {
fmt.Println("当前已是最新版本")
return
}
fmt.Printf("发现新版本: %s\n", latest.Version)
fmt.Printf("更新说明: %s\n", latest.Changelog)
}
2. 执行更新
func performUpdate(updater *update.Updater, latest *update.ReleaseInfo) error {
// 设置更新进度回调
updater.OnProgress = func(progress float64, downloaded, total int64) {
fmt.Printf("\r下载进度: %.2f%% (%d/%d bytes)", progress, downloaded, total)
}
// 执行更新
err := updater.Update(latest)
if err != nil {
return fmt.Errorf("更新失败: %v", err)
}
fmt.Println("\n更新成功!")
return nil
}
3. 完整示例
package main
import (
"fmt"
"github.com/go-rocket/update"
"os"
)
func main() {
// 初始化更新器
updater := update.NewUpdater(
"https://your-update-server.com/updates",
"1.0.0", // 当前版本
)
// 可选配置
updater.SetOptions(&update.Options{
Timeout: 30, // 超时时间(秒)
Checksum: true, // 启用校验和检查
TargetPath: os.Args[0], // 更新目标路径(默认可执行文件自身)
})
// 检查更新
latest, err := updater.CheckForUpdate()
if err != nil {
fmt.Printf("检查更新失败: %v\n", err)
return
}
if latest.Version == updater.CurrentVersion {
fmt.Println("当前已是最新版本")
return
}
fmt.Printf("发现新版本: %s\n", latest.Version)
fmt.Printf("更新说明: %s\n", latest.Changelog)
// 确认是否更新
fmt.Print("是否立即更新? (y/n): ")
var input string
fmt.Scanln(&input)
if input != "y" && input != "Y" {
return
}
// 执行更新
if err := performUpdate(updater, latest); err != nil {
fmt.Println(err)
}
}
func performUpdate(updater *update.Updater, latest *update.ReleaseInfo) error {
updater.OnProgress = func(progress float64, downloaded, total int64) {
fmt.Printf("\r下载进度: %.2f%% (%d/%d bytes)", progress, downloaded, total)
}
err := updater.Update(latest)
if err != nil {
return fmt.Errorf("更新失败: %v", err)
}
fmt.Println("\n更新成功! 请重启应用以完成更新。")
return nil
}
服务器端配置
go-rocket-update 需要一个简单的JSON文件来描述更新信息。服务器上需要提供如下结构的JSON文件:
{
"version": "1.1.0",
"changelog": "修复了一些bug,增加了新功能",
"url": "https://your-update-server.com/downloads/app_v1.1.0.zip",
"checksum": "sha256:abcdef123456...",
"size": 1024000
}
高级功能
1. 自定义HTTP客户端
client := &http.Client{
Timeout: 60 * time.Second,
Transport: &http.Transport{
// 自定义传输配置
},
}
updater.SetHTTPClient(client)
2. 增量更新
// 在ReleaseInfo中添加差异更新信息
{
"version": "1.1.0",
"patch": {
"from": "1.0.0",
"url": "https://your-update-server.com/patches/1.0.0_to_1.1.0.patch",
"checksum": "sha256:..."
}
}
// 代码中会自动优先使用增量更新
3. 更新后重启
updater.SetOptions(&update.Options{
Restart: true, // 更新后自动重启
})
注意事项
- 确保更新服务器支持HTTPS以保证下载安全
- 对于Windows系统,可能需要处理文件占用问题
- 建议在更新前备份重要数据
- 更新过程中应确保有足够的磁盘空间
go-rocket-update 提供了简单而强大的自动更新功能,可以轻松集成到现有的Golang应用程序中。通过合理配置,可以实现安全可靠的自动更新机制。