Skip to Content
Week 11Day 6 - 发布候选

Day 6 - 发布候选

建议用时:180-210 分钟

你将学会什么

  • 什么是发布候选版本
  • RC 和最终发布有什么区别
  • 发布前为什么要冻结范围
  • 发布包里应该放哪些文件
  • README、CHANGELOG、已知问题怎么写
  • 怎么写一份可执行的发布验收清单

发布候选不是“随便打个包”。它是准备交给测试或用户验收的版本。这个版本要能启动、能按文档运行、功能清单可检查、已知问题不隐藏。

本页固定顺序

  1. 先学第一部分:弄懂今天最小、最重要的知识,并运行短例子。
  2. 再学第二部分:把刚学的知识组合成一个完整例子。
  3. 然后做第三部分:自己跟着敲,再完成重复训练和每日小测。
  4. 最后做第四部分:先独立完成作业,再用完整答案检查。

学习衔接

上一页学习的是“设置与偏好”,今天继续学习“发布候选”。先使用上一页已经会的写法,再只增加今天这个新知识点;如果前置内容还不能独立敲出,先回上一页复习,不要硬跳。

今天的最低通过线

第一次学习不要求背完整页。完成下面 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下载依赖
构建 Releasedotnet 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-arm64

README.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

至少包含:

  1. 版本号。
  2. 运行方式。
  3. 是否需要 .NET Runtime。
  4. 本版包含功能。
  5. 验收清单位置。

第 6 步:写 CHANGELOG

至少包含:

  1. 版本号。
  2. 日期。
  3. 新增功能。
  4. 修复内容。
  5. 注意事项。

第 7 步:写已知问题

每个已知问题写三段:

  1. 影响。
  2. 临时处理。
  3. 后续处理。

第 8 步:跑验收清单

RELEASE-CHECKLIST.md 一项一项打勾。

不要只写“通过”,要真的执行:

  • 启动程序。
  • 新增商品。
  • 编辑商品。
  • 搜索商品。
  • 导入 CSV。
  • 保存设置。

第 9 步:写结论

结论只能是两类:

可以进入测试。

或:

需要修复后重新出 RC。

不要写模糊结论。

版本说明

这是 ProductApp 的发布候选版本,用于测试商品管理主流程。

运行方式

  1. 解压发布包。
  2. 进入 app 目录。
  3. 启动 ProductApp。

如果是非自包含发布,目标电脑需要安装对应版本的 .NET Runtime。

本版包含功能

  1. 商品列表。
  2. 新增商品。
  3. 编辑商品。
  4. 删除商品。
  5. 搜索和过滤商品。
  6. JSON 本地保存。
  7. CSV 导入导出。
  8. 审计日志。
  9. 设置保存。

验收入口

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。

验收结果

完成后必须具备:

  1. 发布命令明确。
  2. 发布目录结构明确。
  3. README 能告诉别人怎么运行。
  4. CHANGELOG 能说明版本变化。
  5. KNOWN-ISSUES 没有隐藏已知问题。
  6. RELEASE-CHECKLIST 可以逐项执行。

为什么这个答案是对的

这个答案覆盖了 RC 的核心交付物:

交付物作用
app/可运行程序
README.md运行说明
CHANGELOG.md版本变化
KNOWN-ISSUES.md已知风险
RELEASE-CHECKLIST.md验收依据
sample-data/测试数据

发布候选的标准不是“我这里能跑”,而是别人能按文档启动、按清单验收、按版本追踪问题。