Day 6 - 发布候选
建议用时:180-210 分钟
你将学会什么
- 什么是发布候选版本
- RC 和最终发布有什么区别
- 发布前为什么要冻结范围
- 发布包里应该放哪些文件
- README、CHANGELOG、已知问题怎么写
- 怎么写一份可执行的发布验收清单
发布候选不是“随便打个包”。它是准备交给测试或用户验收的版本。这个版本要能启动、能按文档运行、功能清单可检查、已知问题不隐藏。
本页固定顺序
- 先学第一部分:弄懂今天最小、最重要的知识,并运行短例子。
- 再学第二部分:把刚学的知识组合成一个完整例子。
- 然后做第三部分:自己跟着敲,再完成重复训练和每日小测。
- 最后做第四部分:先独立完成作业,再用完整答案检查。
学习衔接
上一页学习的是“设置与偏好”,今天继续学习“发布候选”。先使用上一页已经会的写法,再只增加今天这个新知识点;如果前置内容还不能独立敲出,先回上一页复习,不要硬跳。
今天的最低通过线
第一次学习不要求背完整页。完成下面 3 项,就可以继续:
- 能用自己的话说明“发布候选”解决什么问题。
- 把第一部分的短例子亲手敲完,并确认每个例子都能运行。
- 不看完整答案完成第三部分至少前 3 个例子,再主动改一个值观察结果。
第一部分:先学原理和最小知识
这一部分从最小知识开始。先读解释,再把紧跟着的短例子敲一遍。发布候选的重点是“可验收”,不是“代码刚好能跑”。
什么是 RC
RC 是 Release Candidate,发布候选版本。
它的意思是:
这个版本已经准备好进入完整验收。如果验收没有发现阻塞问题,就可以作为正式发布版本的基础。RC 不是随便打包。
RC 也不是最终版本。
它处于“功能已冻结,等待验收”的阶段。
RC 和正式版的区别
| 版本 | 目的 | 状态 |
|---|---|---|
| 开发版 | 写功能、改功能 | 可以频繁变化 |
| RC | 验收候选 | 范围冻结,只修问题 |
| 正式版 | 对外交付 | 已验收通过 |
RC 阶段不要继续随便加新功能。
如果 RC 发现严重问题,修复后出新的:
1.0.0-rc.2为什么要版本号
版本号用于追踪:
- 用户拿到的是哪个版本。
- 问题出现在哪个版本。
- 修复从哪个版本开始。
- 需要回滚到哪个版本。
本页使用:
1.0.0-rc.1含义:
1.0.0是准备发布的主版本。rc.1是第一个发布候选。
为什么要 README
README 告诉别人怎么运行。
如果没有 README,测试人员可能不知道:
- 启动哪个文件。
- 是否需要 .NET Runtime。
- 本版包含哪些功能。
- 验收入口在哪里。
README 是交付的一部分。
为什么要 CHANGELOG
CHANGELOG 说明本版改了什么。
它解决的问题是:
- 这次新增了什么。
- 修了什么。
- 有什么注意事项。
没有 CHANGELOG,版本之间差异就说不清。
为什么要记录已知问题
已知问题不是失败。
隐藏已知问题才是风险。
例如当前 CSV 不支持名称里带英文逗号,只要写清影响和临时处理,测试人员就知道怎么验证。
为什么要从发布目录启动
开发目录能启动,不代表发布目录能启动。
发布目录可能缺资源、缺配置、路径不同、权限不同。
所以 RC 必须从发布目录启动一次。
发布候选常用命令和文件速查
| 需求 | 写法/文件 | 作用 |
|---|---|---|
| 还原依赖 | dotnet restore | 下载依赖 |
| 构建 Release | dotnet build -c Release | 检查发布编译 |
| 跑测试 | dotnet test | 验证规则 |
| 发布目录 | dotnet publish -c Release -o ./publish | 生成交付文件 |
| 项目说明 | README.md | 怎么运行 |
| 版本记录 | CHANGELOG.md | 本次改了什么 |
| 已知问题 | KNOWN-ISSUES.md | 还有什么限制 |
| 检查清单 | RELEASE-CHECKLIST.md | 发布前逐项确认 |
RC 检查顺序:
restore
-> build
-> test
-> publish
-> 从 publish 目录启动
-> 跑主流程
-> 更新文档和已知问题第二部分:把知识组合成完整例子
今天要产出一个发布候选包说明。
发布目录可以长这样:
release-candidate/
app/
README.md
CHANGELOG.md
KNOWN-ISSUES.md
RELEASE-CHECKLIST.md
sample-data/
products-import.csv发布命令
在 Avalonia 项目 .csproj 所在目录执行:
dotnet build
dotnet publish -c Release -o ./release-candidate/app如果要发布 macOS Apple Silicon 自包含版本:
dotnet publish -c Release -r osx-arm64 --self-contained true -o ./release-candidate/app-osx-arm64README.md
# ProductApp 1.0.0-rc.1
## 第三部分:跟着准备发布候选
从这里开始动手。
### 第 1 步:确认版本号
先确定本次版本:
```text
1.0.0-rc.1如果这是第二次发布候选,改成:
1.0.0-rc.2第 2 步:执行构建
dotnet build必须没有错误才能继续。
第 3 步:执行发布
dotnet publish -c Release -o ./release-candidate/app解释:
-c Release使用发布配置。-o指定输出目录。
第 4 步:准备目录结构
release-candidate/
app/
README.md
CHANGELOG.md
KNOWN-ISSUES.md
RELEASE-CHECKLIST.md
sample-data/
products-import.csv解释:
app放程序。sample-data放示例数据。- 其他
.md文件放交付说明。
第 5 步:写 README
至少包含:
- 版本号。
- 运行方式。
- 是否需要 .NET Runtime。
- 本版包含功能。
- 验收清单位置。
第 6 步:写 CHANGELOG
至少包含:
- 版本号。
- 日期。
- 新增功能。
- 修复内容。
- 注意事项。
第 7 步:写已知问题
每个已知问题写三段:
- 影响。
- 临时处理。
- 后续处理。
第 8 步:跑验收清单
按 RELEASE-CHECKLIST.md 一项一项打勾。
不要只写“通过”,要真的执行:
- 启动程序。
- 新增商品。
- 编辑商品。
- 搜索商品。
- 导入 CSV。
- 保存设置。
第 9 步:写结论
结论只能是两类:
可以进入测试。或:
需要修复后重新出 RC。不要写模糊结论。
版本说明
这是 ProductApp 的发布候选版本,用于测试商品管理主流程。
运行方式
- 解压发布包。
- 进入
app目录。 - 启动 ProductApp。
如果是非自包含发布,目标电脑需要安装对应版本的 .NET Runtime。
本版包含功能
- 商品列表。
- 新增商品。
- 编辑商品。
- 删除商品。
- 搜索和过滤商品。
- JSON 本地保存。
- CSV 导入导出。
- 审计日志。
- 设置保存。
验收入口
按 RELEASE-CHECKLIST.md 逐项检查。
### CHANGELOG.md
```markdown
# CHANGELOG
## 1.0.0-rc.1 - 2026-06-12
### Added
- 新增商品管理主流程。
- 新增商品搜索和库存过滤。
- 新增 JSON 本地保存。
- 新增 CSV 导入导出。
- 新增角色权限检查。
- 新增审计日志。
- 新增设置页面。
### Fixed
- 修正空名称可以保存的问题。
- 修正价格不是数字时提示不清楚的问题。
### Notes
- 这是发布候选版本,不是最终正式版。KNOWN-ISSUES.md
# Known Issues
## 1. CSV 不支持名称里包含英文逗号
影响:
商品名称如果包含英文逗号,当前导入器会把它拆成多列。
临时处理:
第一版导入文件中,商品名称不要包含英文逗号。
后续处理:
正式版前评估是否接入完整 CSV 解析库。
## 2. 当前没有安装包签名
影响:
部分系统可能提示应用来自未知开发者。
临时处理:
测试人员按内部测试流程启动。
后续处理:
正式发布前补签名和平台发布流程。RELEASE-CHECKLIST.md
# Release Candidate Checklist
版本:1.0.0-rc.1
日期:2026-06-12
## 1. 构建检查
- [ ] `dotnet build` 通过。
- [ ] `dotnet publish -c Release` 通过。
- [ ] 发布目录存在。
- [ ] 主程序文件存在。
## 2. 启动检查
- [ ] 从发布目录启动程序。
- [ ] 主窗口能打开。
- [ ] 没有启动异常。
## 3. 商品主流程
- [ ] 能新增合法商品。
- [ ] 名称为空时不能保存。
- [ ] 价格不是数字时不能保存。
- [ ] 库存小于 0 时不能保存。
- [ ] 能编辑商品。
- [ ] 能删除商品。
- [ ] 删除前会检查权限。
## 4. 搜索过滤
- [ ] 空关键字显示全部商品。
- [ ] 输入关键字能过滤商品。
- [ ] 搜索忽略大小写。
- [ ] 仅显示有库存能过滤库存为 0 的商品。
- [ ] 无结果时有提示。
## 5. 文件功能
- [ ] JSON 保存成功。
- [ ] JSON 读取成功。
- [ ] CSV 导入成功行。
- [ ] CSV 错误行有原因。
- [ ] CSV 能导出成功数据。
## 6. 审计和设置
- [ ] 删除成功写审计。
- [ ] 权限拒绝写审计。
- [ ] 设置能保存。
- [ ] 设置能重新加载。
- [ ] 设置能恢复默认。
## 7. 结论
- [ ] 可以进入测试。
- [ ] 需要修复后重新出 RC。
结论说明:
填写本次验收结论。常见错误和修法
| 错误 | 为什么错 | 修法 |
|---|---|---|
| RC 版本不写后缀 | 容易和正式版混淆 | 使用 1.0.0-rc.1 这类版本号 |
| 发布候选没有冻结功能 | 边测边加功能会引入新风险 | RC 阶段只修阻断问题 |
| 没有验收记录 | 不知道候选版测过什么 | 写 RC_CHECKLIST 和测试结果 |
| 只在开发机验证 | 换环境可能打不开 | 至少用发布目录重新运行一次 |
| 已知问题不记录 | 正式发布时容易漏 | 写清问题、影响、是否阻断 |
小白重复敲写训练
发布候选版要练版本信息、构建和冒烟检查。
训练 1:设置版本
<PropertyGroup>
<Version>1.0.0-rc.1</Version>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</PropertyGroup>修改后重新构建,确认没有 XML 错误。
训练 2:干净构建
dotnet clean
dotnet restore
dotnet build -c Release
dotnet test -c Release每条命令单独执行并查看结果。
训练 3:发布候选包
dotnet publish -c Release -r win-x64 --self-contained true \
-o artifacts/1.0.0-rc.1第三遍写一份三项冒烟检查:能启动、能新增、能重新打开数据。
每日小测
做完本页后,用这 5 题检查是否真的掌握。
1. 判断题
本页的目标不是只把代码运行起来,还要能说清楚“为什么这样写”。
答案:对。能运行只是第一步,能解释原理、常用操作和常见错误,才说明本页内容进入了可复用能力。
2. 填空题
本页主题是:发布候选。今天至少要掌握的 3 个点是:
1. 什么是发布候选版本
2. RC 和最终发布有什么区别
3. 发布前为什么要冻结范围答案:以上 3 点必须能用自己的代码跑通,不能只停留在阅读。
3. 流程题
遇到本页相关功能时,先按什么顺序处理?
答案:先看完整例子,确认最终效果;再读原理和名词;然后跟着第三部分从空项目敲代码;最后对照作业答案检查。
4. 找错误题
如果本页代码运行失败,第一步应该做什么?
答案:先看终端或 IDE 里的第一条错误,找到文件名和行号;不要同时改很多地方。再回到本页的“常见错误和修法”表格,对照错误类型逐项排查。
5. 改需求题
在本页完整例子跑通后,至少改一个小需求。
可选改法:
- 改一个字段名称。
- 多加一个校验条件。
- 多输出一行结果。
- 把固定数据改成用户输入。
- 把一次处理改成多条数据处理。
答案标准:修改后能重新运行,并能说明这次修改影响了哪一段逻辑。重点检查:什么是发布候选版本。
上位机专项练习
发布候选版不是“能编译就行”,还要冻结功能、修复缺陷、记录版本并完成目标机测试。
下面 3 个例子都要亲手敲。先运行原代码,再完成每个例子后面的改动任务。
专项例子 1:发布前检查表
- [ ] Release 构建成功
- [ ] 单元测试全部通过
- [ ] 目标电脑可启动
- [ ] 断网后有提示并可重连
- [ ] 配置和日志路径正确
- [ ] 升级后旧配置可读取运行结果或界面效果:
六项检查都完成才可交付改动任务: 增加 24 小时稳定运行测试。
专项例子 2:版本变更记录
## 1.0.0-rc.1
- 新增设备总览和详情
- 新增报警确认与审计
- 新增点位 CSV 导入导出
- 已知问题: 趋势页仅保留 1000 点运行结果或界面效果:
用户和测试人员知道本版变化改动任务: 修复问题后写 rc.2。
专项例子 3:生成发布包哈希
string hash = Convert.ToHexString(
SHA256.HashData(await File.ReadAllBytesAsync("Hmi.App.zip")));
Console.WriteLine(hash);运行结果或界面效果:
发布包有唯一 SHA256 校验值改动任务: 修改压缩包后比较哈希。
第四部分:作业完整答案
作业要求:准备一份 ProductApp 发布候选说明,包含发布命令、目录结构、README、CHANGELOG、KNOWN-ISSUES、RELEASE-CHECKLIST。
答案 1:发布命令
dotnet build
dotnet publish -c Release -o ./release-candidate/app答案 2:目录结构
release-candidate/
app/
README.md
CHANGELOG.md
KNOWN-ISSUES.md
RELEASE-CHECKLIST.md
sample-data/
products-import.csv答案 3:README.md
# ProductApp 1.0.0-rc.1
## 运行方式
1. 解压发布包。
2. 进入 `app` 目录。
3. 启动 ProductApp。
如果是非自包含发布,目标电脑需要安装对应版本的 .NET Runtime。
## 本版包含功能
1. 商品列表。
2. 新增商品。
3. 编辑商品。
4. 删除商品。
5. 搜索和过滤商品。
6. JSON 本地保存。
7. CSV 导入导出。
8. 审计日志。
9. 设置保存。答案 4:CHANGELOG.md
# CHANGELOG
## 1.0.0-rc.1 - 2026-06-12
### Added
- 新增商品管理主流程。
- 新增搜索和过滤。
- 新增 JSON 保存。
- 新增 CSV 导入导出。
- 新增审计日志。
- 新增设置页面。
### Fixed
- 修正空名称保存问题。
- 修正错误价格提示不清楚的问题。
### Notes
- 这是发布候选版本,不是最终正式版。答案 5:KNOWN-ISSUES.md
# Known Issues
## CSV 不支持名称里包含英文逗号
影响:
商品名称如果包含英文逗号,当前导入器会把它拆成多列。
临时处理:
第一版导入文件中,商品名称不要包含英文逗号。
后续处理:
正式版前评估是否接入完整 CSV 解析库。答案 6:RELEASE-CHECKLIST.md
# Release Candidate Checklist
版本:1.0.0-rc.1
日期:2026-06-12
## 构建
- [ ] dotnet build 通过。
- [ ] dotnet publish -c Release 通过。
- [ ] 发布目录存在。
## 功能
- [ ] 能新增商品。
- [ ] 能编辑商品。
- [ ] 能删除商品。
- [ ] 能搜索商品。
- [ ] 无结果时有提示。
- [ ] 错误输入不会崩溃。
## 文件
- [ ] JSON 能保存和读取。
- [ ] CSV 能导入成功行。
- [ ] CSV 错误行有原因。
- [ ] 设置能保存和恢复默认。
## 结论
- [ ] 可以进入测试。
- [ ] 需要修复后重新出 RC。验收结果
完成后必须具备:
- 发布命令明确。
- 发布目录结构明确。
- README 能告诉别人怎么运行。
- CHANGELOG 能说明版本变化。
- KNOWN-ISSUES 没有隐藏已知问题。
- RELEASE-CHECKLIST 可以逐项执行。
为什么这个答案是对的
这个答案覆盖了 RC 的核心交付物:
| 交付物 | 作用 |
|---|---|
app/ | 可运行程序 |
README.md | 运行说明 |
CHANGELOG.md | 版本变化 |
KNOWN-ISSUES.md | 已知风险 |
RELEASE-CHECKLIST.md | 验收依据 |
sample-data/ | 测试数据 |
发布候选的标准不是“我这里能跑”,而是别人能按文档启动、按清单验收、按版本追踪问题。