| name | tizu-release |
| description | TizuMark 发布流程:版本号更新、构建三种安装包、签名、生成 update JSON、创建 Gitee/GitHub Release、上传附件、验证、提交推送。当用户说'发布/release/新版本'时使用此技能。 |
TizuMark 发布流程
按顺序执行以下所有步骤。每步完成后标记 ✅,遇到错误立即停止并报告。
发布是红线操作。必须用户明确说"发布"后才开始执行。构建(build)和推送(push)也是红线操作,执行前先确认。
前置检查
- 确认当前工作目录是
D:\project\tizu-mark
- 确认用户已告知新版本号(格式
x.y.z,如 1.0.7)
- 读取当前版本号:检查
package.json 的 version 字段
- 向用户确认:"即将从 v{当前版本} 发布到 v{新版本},确认开始?"
步骤 1:更新版本号
将以下 全部位置 的版本号统一改为新版本。务必全部同步,缺漏会导致显示/文档版本不一致。
| 文件 | 字段 / 位置 | 说明 |
|---|
package.json | "version" | 构建必需 |
src-tauri/tauri.conf.json | "version" | 构建必需,getVersion() 读取此值 |
src-tauri/Cargo.toml | version = "..." | 构建必需 |
update-windows-x86_64.json | "version" + 下载 URL | 在步骤 5 一并更新 |
README.md | Version badge Version-{version}-blue | 文档展示 |
README.en.md | Version badge Version-{version}-blue | 英文文档展示 |
src/app.js | 中文 i18n versionInfo: 'TizuMark v{version}' | 关于对话框 |
src/app.js | 英文 i18n versionInfo: 'TizuMark v{version}' | 关于对话框(英文) |
src/index.html | #about-version 硬编码 | 兜底文本 |
src/tauri-mock.js | getVersion 返回值 | 浏览器联调 mock |
禁止手改 src-tauri/Cargo.lock 与 package-lock.json,由构建工具自动更新。
步骤 2:构建
npm run build
构建产物(三种安装包):
src-tauri/target/release/bundle/nsis/TizuMark_{version}_x64-setup.exe
src-tauri/target/release/bundle/msi/TizuMark_{version}_x64_en-US.msi
src-tauri/target/release/TizuMark_{version}_x64.exe(绿色版)
构建失败?检查版本号三处(package.json / tauri.conf.json / Cargo.toml)是否一致。
步骤 3:复制到本地归档
Copy-Item -Path "src-tauri/target/release/bundle/nsis/TizuMark_{version}_x64-setup.exe" -Destination "release/" -Force
Copy-Item -Path "src-tauri/target/release/bundle/msi/TizuMark_{version}_x64_en-US.msi" -Destination "release/" -Force
Copy-Item -Path "src-tauri/target/release/TizuMark_{version}_x64.exe" -Destination "release/" -Force
步骤 4:签名安装包
三种安装包都需要签名。
$env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD="tizu2024"; npx tauri signer sign -f C:\Users\admin\.tauri\tizu-updater.key "src-tauri/target/release/bundle/nsis/TizuMark_{version}_x64-setup.exe"
$env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD="tizu2024"; npx tauri signer sign -f C:\Users\admin\.tauri\tizu-updater.key "src-tauri/target/release/bundle/msi/TizuMark_{version}_x64_en-US.msi"
$env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD="tizu2024"; npx tauri signer sign -f C:\Users\admin\.tauri\tizu-updater.key "src-tauri/target/release/TizuMark_{version}_x64.exe"
记下输出中的 NSIS signature(update JSON 需要此值)。
步骤 5:生成 update-windows-x86_64.json
编辑项目根目录的 update-windows-x86_64.json:
version → 新版本号
notes → 更新的 release notes(JSON 转义 \n)
pub_date → 当天日期 YYYY-MM-DDT00:00:00Z
platforms.windows-x86_64.signature → 步骤 4 的 NSIS 签名
platforms.windows-x86_64.url → https://gitee.com/tizu/TizuMark-Markdown-Editor/releases/download/v{version}/TizuMark_{version}_x64-setup.exe
同时复制到归档:
Copy-Item -Path "update-windows-x86_64.json" -Destination "release/" -Force
步骤 6:创建 Gitee Release
不要删除旧 Release,直接新建。使用 Node.js 脚本(保证中文编码正确):
const https = require('https');
const fs = require('fs');
const path = require('path');
const TOKEN = process.env.GITEE_TOKEN;
const VERSION = '{version}';
const releaseBody = {
tag_name: `v${VERSION}`,
name: `v${VERSION}`,
target_commitish: 'master',
body: `## ⬇️ 下载\n\n> **🏆 推荐大多数用户选择:** [⬇ TizuMark_${VERSION}_x64-setup.exe](https://gitee.com/tizu/TizuMark-Markdown-Editor/releases/download/v${VERSION}/TizuMark_${VERSION}_x64-setup.exe)\n>\n> **🛠 企业/批量部署:** [⬇ TizuMark_${VERSION}_x64_en-US.msi](https://gitee.com/tizu/TizuMark-Markdown-Editor/releases/download/v${VERSION}/TizuMark_${VERSION}_x64_en-US.msi)\n>\n> **📦 绿色版(免安装):** [⬇ TizuMark_${VERSION}_x64.exe](https://gitee.com/tizu/TizuMark-Markdown-Editor/releases/download/v${VERSION}/TizuMark_${VERSION}_x64.exe)\n\n### 三种安装包说明\n\n| 安装包 | 适用人群 | 特点 |\n|--------|---------|------|\n| ⭐ **NSIS 安装包 (.exe)** — **推荐** | 绝大多数 Windows 用户 | 传统的 setup 向导安装,支持自定义安装路径、创建桌面快捷方式、自动注册文件关联。双击即装,即装即用。 |\n| **MSI 安装包 (.msi)** | 企业 IT 管理员、需要批量部署的用户 | 标准的 Windows Installer 格式,支持组策略推送、静默安装(msiexec /i TizuMark_${VERSION}_x64_en-US.msi /qn)、适合企业环境集中管理。 |\n| **绿色版 (.exe)** | 追求便携的用户 | 单文件免安装,解压即用,适合 U 盘携带、临时使用,不写注册表。 |\n\n---\n\n## ✨ v 更新内容\n\n### 新增\n- ...\n\n### 改进\n- ...\n\n### 修复\n- ...\n\n> 使用中遇到问题欢迎加 QQ 群:1035294939`,
: ,
};
() {
( {
payload = body ? .(body) : ;
options = {
: ,
: ,
method,
: { : , : },
};
(payload) options.[] = .(payload, );
req = https.(options, {
data = ;
res.(, data += chunk);
res.(, {
(res. >= && res. < ) {
{ (.(data)); } { (data); }
} { ( ()); }
});
});
req.(, reject);
(payload) req.(payload);
req.();
});
}
() {
( {
fileName = path.(filePath);
boundary = + .();
header = ;
footer = ;
fileContent = fs.(filePath);
body = .([.(header, ), fileContent, .(footer, )]);
options = {
: ,
: ,
: ,
: { : , : , : body. },
};
req = https.(options, {
data = ;
res.(, data += chunk);
res.(, { { (.(data)); } { (data); } });
});
req.(, reject);
req.(body);
req.();
});
}
( () => {
release = (, , releaseBody);
.( + release.);
files = [
,
,
,
,
];
( f files) {
r = (release., f);
.( + path.(f));
}
.( + release.);
})();
将脚本保存为 scripts/release.js,替换 {version} 后执行:
node scripts/release.js
完成后删除临时脚本。
步骤 7:创建 GitHub Release
const GITHUB_TOKEN = process.env.GITHUB_TOKEN;
function githubRequest(method, path, body, contentType = 'application/json') {
return new Promise((resolve, reject) => {
const payload = body ? (typeof body === 'string' ? body : JSON.stringify(body)) : null;
const options = {
hostname: 'api.github.com',
path: `/repos/tizuio/TizuMark-Markdown-Editor${path}`,
method,
headers: {
'Authorization': `Bearer ${GITHUB_TOKEN}`,
'Accept': 'application/vnd.github+json',
'Content-Type': contentType,
'User-Agent': 'TizuMark-Release',
},
};
if (payload) options.headers['Content-Length'] = Buffer.byteLength(payload, 'utf-8');
const req = https.request(options, (res) => {
let data = '';
res.on('data', data += chunk);
res.(, {
(res. >= && res. < ) {
{ (.(data)); } { (data); }
} { ( ()); }
});
});
req.(, reject);
(payload) req.(payload);
req.();
});
}
() {
( {
fileName = path.(filePath);
fileContent = fs.(filePath);
options = {
: ,
: ,
: ,
: {
: ,
: ,
: fileContent.,
: ,
},
};
req = https.(options, {
data = ;
res.(, data += chunk);
res.(, { { (.(data)); } { (data); } });
});
req.(, reject);
req.(fileContent);
req.();
});
}
GitHub Release body 用英文,内容与 Gitee 对应。
步骤 8:验证
node -e "const https=require('https');https.get('https://gitee.com/api/v5/repos/tizu/TizuMark-Markdown-Editor/releases/{Release_ID}',{headers:{'Authorization':'Bearer ' + process.env.GITEE_TOKEN}},r=>{let d='';r.on('data',c=>d+=c);r.on('end',()=>{const j=JSON.parse(d);console.log('name:',j.name);console.log('body contains 下载:',j.body.includes('下载'))})})"
确认 Gitee Release body 中文显示正常。
步骤 9:提交推送
git add package.json src-tauri/tauri.conf.json src-tauri/Cargo.toml src-tauri/src/lib.rs src/app.js src/index.html src/styles.css update-windows-x86_64.json README.md README.en.md CLAUDE.md
git commit -m "chore: bump version to {version}"
git push
关键注意事项
- 构建前先更新版本号(3 个文件),版本号不一致会导致构建失败
- 永远不要在未签名的状态下发布安装包
- Gitee API 的 release body 必须用 Node.js 发送(PowerShell 的
Invoke-RestMethod 在 PS5.1 中编码会出错,导致中文乱码)
- 永远不要删除旧 Release,直接新建
- 每次发布后,
release/ 目录包含最新全套产物,可作为备份
- 私钥路径:
C:\Users\admin\.tauri\tizu-updater.key,密码:tizu2024
停止条件
所有以下条件满足时,发布完成: