白嫖,爽!
有两种方法可以让 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 import { context, getOctokit } from '@actions/github' import { readFile } from 'node:fs/promises' const octokit = getOctokit (process.env .GITHUB_TOKEN )const updateRelease = async ( ) => { 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 { "bundle" : { "createUpdaterArtifacts" : true } , "plugins" : { "updater" : { "pubkey" : "CONTENT FROM PUBLICKEY.PEM" , "endpoints" : [ "https://github.com/user/repo/releases/latest/download/latest.json" ] } } }