白嫖,爽!

有两种方法可以让 Tauri 的 app 检查更新。动态更新服务器和静态 json。

动态更新服务器

动态更新服务器需要提供一个 api,服务需要返回200 OK状态并在 response 里包含以下内容

1
2
3
4
5
6
7
{
"version": "0.2.0",
"pub_date": "2020-09-18T12:29:53+01:00",
"url": "https://mycompany.example.com/myapp/releases/myrelease.tar.gz",
"signature": "Content of the relevant .sig file",
"notes": "These are some release notes"
}

其中"url", "version""signature"是必须的。url 是最新版本包的 url。

静态 json

不过我们提供 api 是不可能提供的,起一个服务又得消耗我少的可怜的服务器资源。
不如生成一个静态的 json 文件,我们可以把它放在 GitHub Release 里。这样就不需要自己再维护一个服务了。白嫖,爽!

首先需要创建 GitHub Action 工作流,可以从这里获取到官方的工作流文件

然后要写一段脚本,先安装所需的依赖

1
pnpm i -D @actions/github

脚本如下(我从网上搬来的):
主要做的事就是读一下这个仓库的Github Release里那个tag标记为updater的发布,如果有旧的latest.json文件,删除它,然后上传新的latest.json文件。
latest.json文件是Tauri构建后自动生成的,版本更新的相关信息都帮你写好了,直接用就行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// srcipts/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()

在工作流文件末尾添加上触发脚本运行的命令

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

在 GitHub Release 里新增一个 tag 为 updater 的 Release
进入 release 页点击这个按钮

新增一个 tag 为 updater 的 Release

将其设为 pre-release

现在去运行一下 GitHub Action
这样就能够在构建完成后将latest.json文件更新到 updater Release 中
复制lastest.json的链接,并将其填入 endpoints 中,就能实现新版本的检查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// tauri.conf.json
{
"bundle": {
"createUpdaterArtifacts": true
},
"plugins": {
"updater": {
"pubkey": "CONTENT FROM PUBLICKEY.PEM",
"endpoints": [
// 填入复制的链接
"https://github.com/user/repo/releases/latest/download/latest.json"
]
}
}
}