Skip to content

结合 github 实现自动更新

简介

通过使用 electron-builder 与和 electron-updater,结合 github 可以实现自动更新。

步骤 1: 创建对应 github 仓库存储代码,获取到 github token

  1. 登录 github,点击右上角头像,选择 Settings
  2. 在左侧菜单栏中选择 Developer settings
  3. 在右侧菜单栏中选择 Personal access tokens 下的 Tokens(classic)
  4. 点击 Generate new token
  5. 填写 Token description,选择有效期,选择 scopes 中的 repo
  6. 点击 Generate token

步骤 2: 配置 electron-builder.yml 文件

js
publish: provider: github;
owner: "your github name";
repo: "your github store name";
token: "your github token";
releaseType: "release";

步骤 3: 配置 upload.ts 文件

js
import { autoUpdater } from "electron-updater";
import { BrowserWindow, ipcMain } from "electron";

export function setupUpdate(mainWindow: BrowserWindow) {
  // 默认不自动下载,等待用户确认
  autoUpdater.autoDownload = false;

  // 检测下载进度
  autoUpdater.on("download-progress", (progressObj) => {
    mainWindow.webContents.send("update-progress", {
      percent: progressObj.percent,
      transferred: progressObj.transferred,
      total: progressObj.total,
      bytesPerSecond: progressObj.bytesPerSecond,
    });
  });

  // 更新下载完成
  autoUpdater.on("update-downloaded", () => {
    mainWindow.webContents.send("update-downloaded");
  });

  // 检测到新版本
  autoUpdater.on("update-available", (info) => {
    mainWindow.webContents.send("update-available", info);
  });

  // 没有新版本
  autoUpdater.on("update-not-available", () => {
    mainWindow.webContents.send("update-not-available");
  });

  // 检查更新出错
  autoUpdater.on("error", (err) => {
    mainWindow.webContents.send("update-error", err);
  });

  // 监听开始下载的请求
  ipcMain.on("start-download", () => {
    autoUpdater.downloadUpdate();
  });

  // 监听安装更新的请求
  ipcMain.on("quit-and-install", () => {
    autoUpdater.quitAndInstall(false, true);
  });

  // 开始检查更新
  autoUpdater.checkForUpdates();
}

步骤 4: 配置 index.ts 文件

js
import { app, shell, BrowserWindow, ipcMain, Tray, Menu } from "electron";
import { join } from "path";
import { electronApp, optimizer, is } from "@electron-toolkit/utils";
import { setupUpdate } from "./update";

let mainWindow: BrowserWindow | null = null;

function createWindow(): void {
  const iconPath = join(__dirname, "../../resources/icon.png");
  mainWindow = new BrowserWindow({
    width: 900,
    height: 670,
    show: false,
    autoHideMenuBar: true,
    icon: iconPath,
    ...(process.platform === "linux" ? { iconPath } : {}),
    webPreferences: {
      preload: join(__dirname, "../preload/index.js"),
      sandbox: false,
    },
    frame: false,
    transparent: true,
  });

  // ...

  // 获取应用版本号
  ipcMain.handle("get-version", () => {
    return app.getVersion();
  });

  // 获取应用更新
  ipcMain.handle("get-app-update", () => {
    setupUpdate(mainWindow);
  });
}

步骤 5: 配置 package.json 文件

js
"scripts": {
    "build": "electron-vite build",
    "build:win": "npm run build && electron-builder --win --config --publish always",
  }

步骤 6: 打包后会自动发布到 github 仓库上,然后会产生一个 release 版本.

总结

总体思路就是:

  1. 配置 github 仓库,获取到 github token
  2. 配置 electron-builder.yml 文件,将代码打包到 github 仓库上
  3. 配置 upload.ts 文件,监听用户的更新请求,下载更新,安装更新
  4. 配置 index.ts 文件,监听用户的更新请求,获取版本号,获取应用更新
  5. 配置 package.json 文件,打包命令,发布命令

贡献者

unthapy
unthapy

用知识点燃技术的火山