You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
tauri signer generate -w ~/.tauri/omb.key
$ tauri signer generate -w /Users/lencx/.tauri/omb.key
Generating new private key without password.
Please enter a password to protect the secret key.
Password:
Password (one more time):
Deriving a key from the password in order to encrypt the secret key... done
Your keypair was generated successfully
Private: /Users/lencx/.tauri/omb.key (Keep it secret!)
Public: /Users/lencx/.tauri/omb.key.pub
---------------------------
Environment variabled used to sign:
`TAURI_PRIVATE_KEY` Path or String of your private key
`TAURI_KEY_PASSWORD` Your private key password (optional)
ATTENTION: If you lose your private key OR password, you'll not be able to sign your update package and updates will not works.---------------------------✨ Done in 39.09s.
// scripts/release.mjsimport{createRequire}from'module';import{execSync}from'child_process';importfsfrom'fs';importupdatelogfrom'./updatelog.mjs';constrequire=createRequire(import.meta.url);asyncfunctionrelease(){constflag=process.argv[2]??'patch';constpackageJson=require('../package.json');let[a,b,c]=packageJson.version.split('.').map(Number);if(flag==='major'){// 主版本a+=1;b=0;c=0;}elseif(flag==='minor'){// 次版本b+=1;c=0;}elseif(flag==='patch'){// 补丁版本c+=1;}else{console.log(`Invalid flag "${flag}"`);process.exit(1);}constnextVersion=`${a}.${b}.${c}`;packageJson.version=nextVersion;constnextTag=`v${nextVersion}`;awaitupdatelog(nextTag,'release');// 将新版本写入 package.json 文件fs.writeFileSync('./package.json',JSON.stringify(packageJson,null,2));// 提交修改的文件,打 tag 标签(tag 标签是为了触发 github action 工作流)并推送到远程execSync('git add ./package.json ./UPDATE_LOG.md');execSync(`git commit -m "v${nextVersion}"`);execSync(`git tag -a v${nextVersion} -m "v${nextVersion}"`);execSync(`git push`);execSync(`git push origin v${nextVersion}`);console.log(`Publish Successfully...`);}release().catch(console.error);
// scripts/updatelog.mjsimportfsfrom'fs';importpathfrom'path';constUPDATE_LOG='UPDATE_LOG.md';exportdefaultfunctionupdatelog(tag,type='updater'){constreTag=/## v[\d\.]+/;constfile=path.join(process.cwd(),UPDATE_LOG);if(!fs.existsSync(file)){console.log('Could not found UPDATE_LOG.md');process.exit(1);}let_tag;consttagMap={};constcontent=fs.readFileSync(file,{encoding: 'utf8'}).split('\n');content.forEach((line,index)=>{if(reTag.test(line)){_tag=line.slice(3).trim();if(!tagMap[_tag]){tagMap[_tag]=[];return;}}if(_tag){tagMap[_tag].push(line);}if(reTag.test(content[index+1])){_tag=null;}});if(!tagMap?.[tag]){console.log(`${type==='release' ? '[UPDATE_LOG.md] ' : ''}Tag ${tag} does not exist`);process.exit(1);}returntagMap[tag].join('\n').trim()||'';}
# 如果签名打包成功会看到以下信息(以 macOS 为例)
Info 1 updater archive at:
Info /Users/lencx/github/lencx/OhMyBox/src-tauri/target/release/bundle/macos/OhMyBox.app.tar.gz.sig
✨ Done in 58.55s.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
这篇文章会有一点啰嗦,我希望想把解决问题的一些思路展现出来,给遇到问题无从下手的朋友带来一些启发。
Tauri 进阶篇 - 自动更新源码阅读(付费)
签名
Tauri 通过签名来保证安全更新应用。 签名更新应用需要做两件事:
tauri.conf.json
中添加公钥 (pubkey),以在安装前验证更新存档。生成签名
使用 Tauri CLI 提供的命令可以生成密钥(
.pub
后缀的文件为公钥):tauri.conf.json 配置
200 OK
进行响应,并在正文中包含更新 JSON。 如果不需要更新,服务器必须响应状态代码204 No Content
。实现步骤
拆解问题
要实现自动升级应用主要分为以下几个步骤:
tauri build
)的环境变量tauri.conf.json -> updater.pubkey
tauri.conf.json -> updater.endpoints
tauri.conf.json -> updater.dialog
配置为true
,启用内置通知更新应用的弹窗。设置为 false 则需要自行通过 js 事件来处理(暂不推荐,喜欢折腾的朋友可以自行尝试)因为应用的跨平台打包借助了
github action
的工作流来实现,具体可以参考【Tauri 入门篇 - 跨平台编译】,所以更新也同样使用github action
来实现,充分发挥 github 的能力(简单来说,就是不需要借助其他第三方平台或服务就可以实现整个应用的自动化发布更新)。梳理流程
tauri.conf.json -> updater.endpoints
代码实现
Step1
生成公私钥
tauri signer generate -w ~/.tauri/omb.key
配置公钥
pubkey
(~/.tauri/omb.key.pub
)及资源地址endpoints
(github pages 地址):Step2
在项目根路径下创建
scripts
目录,然后在scripts
下依次创建release.mjs
,updatelog.mjs
,updater.mjs
三个 .mjs 文件:scripts/release.mjs
- 版本发布,因发布需涉及多处改动(如版本,版本日志,打 tag 标签等等),故将其写成脚本,减少记忆成本scripts/updatelog.mjs
- 版本更新日志处理,供scripts/updater.mjs
脚本使用scripts/updater.mjs
- 生成应用更新需要的静态文件# 安装开发依赖 yarn add -D node-fetch @actions/github
在根路径下创建
UPDATE_LOG.md
文件,通知用户更新注意事项,格式如下(使用版本号作为标题,具体请查看scripts/updatelog.mjs
):修改
package.json
,在 "scripts" 中加入updater
和release
命令:Step3
Action 配置请参考之前的文章【Tauri 入门篇 - 跨平台编译】,此处新增环境设置签名和静态资源推送。
设置 Secret
配置变量
Repo -> Settings -> Secrets -> Actions -> New repository secret
:~/.tauri/omb.key.pub
内容TAURI_PRIVATE_KEY
******
TAURI_KEY_PASSWORD
******
设置
.github/workflows/release.yml
发布应用
功能开发完成,提交代码后,只需执行
yarn release
命令就可以自动进行应用发布了。如果不想借助 github 打包和静态资源存放,也可以参考上面的步骤,自行部署。注意:每次执行
yarn release
发布版本,主版本
,次版本
,补丁版本
都是自增 1。常见问题
Error A public key has been found, but no private key
如果在
tauri.conf.json
中配置了pubkey
,但未设置环境变量会出现以下错误:解决方案:
版本信息错误
发布的应用版本以
tauri.conf.json
中的package.version
为准,在发布新版本时注意更新version
。可能造成更新失败的原因
endpoints
地址来解决,安装包也可以放在自建服务器来提高下载的稳定性platforms[platform].signature
)是否完整,签名内容可以在tauri build
产生的target/release/bundle/<platform>/*.sig
文件中查看Beta Was this translation helpful? Give feedback.
All reactions