golang实现应用程序自动更新功能的插件库go-rocket-update的使用

go-rocket-update: 构建自更新Go程序

go-rocket-update是一个让Golang应用程序能够轻松安全地实现自我更新的库。

Go rocket image

主要特性

  • 灵活的更新方式(例如使用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)的最新release
  • provider.Gitlab: 检查Gitlab上带有特定归档名(zip或tar.gz)的最新release
  • provider.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, // 更新后自动重启
})

注意事项

  1. 确保更新服务器支持HTTPS以保证下载安全
  2. 对于Windows系统,可能需要处理文件占用问题
  3. 建议在更新前备份重要数据
  4. 更新过程中应确保有足够的磁盘空间

go-rocket-update 提供了简单而强大的自动更新功能,可以轻松集成到现有的Golang应用程序中。通过合理配置,可以实现安全可靠的自动更新机制。

回到顶部