likes
comments
collection
share

Tauri 2.0 Updater自动更新指南

作者站长头像
站长
· 阅读数 3

Tauri 2.0 Updater自动更新指南

Tauri2.0 将原来的updater 单独封装成了插件plugins-workspace/plugins/updater

tauri.conf.json中的配置也从updater变成了plugins.updater,具体可以参考Upgrade from Tauri 1.0 | Tauri

而且原来的dialogactive两个配置字段也已经删除了,所以现在的updater 需要自己手动写检查更新相关逻辑。

这些逻辑都很简单,这里贴上官方的示例

1.安装插件

pnpm tauri add updater
pnpm tauri add process

通过官方的脚手架安装会自动帮我们在rust中注册插件和安装npm 依赖

import { check } from "@tauri-apps/plugin-updater";
import { relaunch } from "@tauri-apps/plugin-process";
const update = await check();
if (update?.available) {
  await update.downloadAndInstall();
  await relaunch();
}

详细请参考plugins-workspace/plugins/updater

2.配置插件

tauri.conf.json

{
  "productName": "comfyui-startup",
  "version": "0.1.8",
  "identifier": "com.tauri.comfyui-startup",
  "build": {
    "beforeDevCommand": "pnpm dev",
    "devUrl": "http://localhost:1420",
    "beforeBuildCommand": "pnpm build",
    "frontendDist": "../dist"
  },
  // 核心配置
  "plugins": {
    "updater": {
      "endpoints": [
        "your json services",
      ],
      "pubkey": "your pub key"
    }
  },
	//...
}

这里有两个核心配置

  • pubkey:tauri cli自动生成的,用于生成更新包校验签名
  • endpoints:静态或动态json 服务,该json带有相关更新信息

这里贴上官方的json文件作为参考。

{
  "version": "v1.0.0",
  "notes": "Test version",
  "pub_date": "2020-06-22T19:25:57Z",
  "platforms": {
    "darwin-x86_64": {
      "signature": "Content of app.tar.gz.sig",
      "url": "https://github.com/username/reponame/releases/download/v1.0.0/app-x86_64.app.tar.gz"
    },
    "darwin-aarch64": {
      "signature": "Content of app.tar.gz.sig",
      "url": "https://github.com/username/reponame/releases/download/v1.0.0/app-aarch64.app.tar.gz"
    },
    "linux-x86_64": {
      "signature": "Content of app.AppImage.tar.gz.sig",
      "url": "https://github.com/username/reponame/releases/download/v1.0.0/app-amd64.AppImage.tar.gz"
    },
    "windows-x86_64": {
      "signature": "Content of app.msi.sig",
      "url": "https://github.com/username/reponame/releases/download/v1.0.0/app-x64.msi.zip"
    }
  }
}

详细内容请参考Updater | Tauri Apps

3.生成key

pnpm tauri signer generate -w ~/.tauri/myapp.key

Tauri 2.0 Updater自动更新指南

官方文档Updater | Tauri Apps

4.使用GitHub Actions自动化

使用Tauri 官方提供的GitHub Actions,可以自动发布带有assets的release和自动生成updater.json文件。而且也能利用GitHub 构建其他平台的二进制程序。属于是省心又省力。

接下来将详细介绍该如何操作

有两种思路白嫖静态json服务,而且都能与GitHub Actions完美结合,做到不用动手也能免费的自动化更新。

  1. 使用Github Release
  2. 使用Github Pages

首先需要将第三步生成的私钥和密码配置到GitHub中

Tauri 2.0 Updater自动更新指南

Tauri 2.0 Updater自动更新指南

Tauri 2.0 Updater自动更新指南

分别将两个secrets添加进去,后面工作流中会使用到

1.Github Release

使用该方式需要先手动创建一个Release

基本操作就不介绍了。

然后在项目下创建文件.github/workflows/publish.yaml

name: Release
# 触发方式
on:
  push:
    tags:
      - "v*"
  workflow_dispatch:

jobs:
  release:
  	# 由于需要创建release所以需要设置写入权限
    permissions:
      contents: write
    strategy:
      fail-fast: false
      matrix:
      	# 我这里只需要两个平台,完整的可以参考官方的workflow
        platform: ['windows-latest', 'macos-latest']

    runs-on: ${{ matrix.platform }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
      - name: Rust setup
        uses: dtolnay/rust-toolchain@stable
      
      - name: Install pnpm
        run: npm install -g pnpm
      - name: Sync node version and setup cache
        uses: actions/setup-node@v3
        with:
          node-version: "lts/*"
          cache: "pnpm"
      - name: Install frontend dependencies
        run: pnpm install --no-frozen-lockfile
      	# 使用tauri actions
      - name: Build the app
        id: build
        uses: tauri-apps/tauri-action@v0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          # 使用之前配置的私钥
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
          # 使用之前配置的私钥密码
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_PRIVATE_KEY_PASSWORD }}
        with:
          tagName: ${{ github.ref_name }}
          releaseName: "ComfyUI Startup v__VERSION__"
          releaseBody: "See the assets to download and install this version."
          releaseDraft: true
          prerelease: false

      - name: Upload assets
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        # 运行自己的脚本
        run: node scripts/updater.mjs
        

官方文档tauri-apps/tauri-action

运行完官方的工作流后,它会自动生成latest.json文件,这时候我们只需要将其上传到Updater release就行。

注意到了node scripts/updater.mjs吗?

这是需要自己编写的脚本文件

// 注意要安装@actions/github依赖
import { context, getOctokit } from "@actions/github";
import { readFile } from "node:fs/promises";

// 在容器中可以通过env环境变量来获取参数
const octokit = getOctokit(process.env.GITHUB_TOKEN);

const updateRelease = async () => {
  // 获取updater tag的release
  const { data: release } = await octokit.rest.repos.getReleaseByTag({
    owner: context.repo.owner,
    repo: context.repo.repo,
    tag: "updater",
  });
  // 删除旧的的文件
  const deletePromises = release.assets
    .filter((item) => item.name === "latest.json")
    .map(async (item) => {
      await octokit.rest.repos.deleteReleaseAsset({
        owner: context.repo.owner,
        repo: context.repo.repo,
        asset_id: item.id,
      });
    });

  await Promise.all(deletePromises);

  // 上传新的文件
  const file = await readFile("latest.json", { encoding: "utf-8" });

  await octokit.rest.repos.uploadReleaseAsset({
    owner: context.repo.owner,
    repo: context.repo.repo,
    release_id: release.id,
    name: "latest.json",
    data: file,
  });
};

updateRelease();

这样就能够在构建完成后将latest.json文件更新到updater Release中

Tauri 2.0 Updater自动更新指南

然后右键复制latest.json的链接填到tauri.conf.json中就能实现自动更新了。

2.使用Github Pages

使用Github Pages可以不用手动创建一个新的Release。

核心逻辑是把在官方tauri actions运行完后生成的latest.json文件拷贝到要上传gh-pages的目录。

工作流文件

name: Release
# 触发方式
on:
  push:
    tags:
      - "v*"
  workflow_dispatch:

jobs:
  release:
  	# 由于需要创建release所以需要设置写入权限
    permissions:
      contents: write
    strategy:
      fail-fast: false
      matrix:
      	# 我这里只需要两个平台,完整的可以参考官方的workflow
        platform: ['windows-latest', 'macos-latest']

    runs-on: ${{ matrix.platform }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
      - name: Rust setup
        uses: dtolnay/rust-toolchain@stable
      
      - name: Install pnpm
        run: npm install -g pnpm
      - name: Sync node version and setup cache
        uses: actions/setup-node@v3
        with:
          node-version: "lts/*"
          cache: "pnpm"
      - name: Install frontend dependencies
        run: pnpm install --no-frozen-lockfile
      	# 使用tauri actions
      - name: Build the app
        id: build
        uses: tauri-apps/tauri-action@v0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          # 使用之前配置的私钥
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
          # 使用之前配置的私钥密码
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_PRIVATE_KEY_PASSWORD }}
        with:
          tagName: ${{ github.ref_name }}
          releaseName: "ComfyUI Startup v__VERSION__"
          releaseBody: "See the assets to download and install this version."
          releaseDraft: true
          prerelease: false

      - name: Upload assets
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        # 运行自己的脚本
        run: node scripts/publish.mjs
        
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./publish
          keep_files: true

publish.mjs

import { readFile, copyFile, writeFile, mkdir } from "node:fs/promises";
import { join } from "node:path";

const targetDir = join(import.meta.dirname, "../", "publish");

const publish = async () => {
  await mkdir(targetDir, { recursive: true });

  const file = await readFile("latest.json", { encoding: "utf-8" });
  // 这里我是需要手动处理一下json 所以先读取在写入到指定目录,具体到逻辑可以完全按照您自己的想法来
  const data = JSON.parse(file);
  if (data.platforms["darwin-x86_64"]) {
    data.platforms["darwin-aarch64"] = data.platforms["darwin-x86_64"];
  }
  await writeFile(
    join(targetDir, "latest.json"),
    JSON.stringify(data, null, 2)
  );
};

publish();

最后

您可以在我的GitHub仓库yexiyue/Comfyui-Startup中找到完整内容。如果您觉得该项目对您有所帮助或感兴趣,恳请您给予宝贵的支持,包括点赞(Star)和收藏该项目,非常感谢您的关注与支持!