本次发布聚焦降低误报风险、规范发布产物和重构仓库文档。 主要变更: - 删除开机自启功能,移除 Windows 启动项注册表写入逻辑。 - 新增标准应用清单,声明应用以普通用户权限运行。 - 新增 framework-dependent 发布脚本,保持发布包不内置 .NET 运行时。 - 禁用单文件、自解压、裁剪和 ReadyToRun 发布方式,保持产物结构透明。 - 将发布资产命名规范化为 omni-notify-v0.2.0-win-x64.zip。 - 重写文档结构:README.md 面向用户,docs/development.md 面向开发者。 - 删除过时且内容重复的 PRD.md 与 docs/usage.md。 验证: - dotnet build .\OmniNotify.csproj -c Release 构建通过。 - 发布脚本成功生成 v0.2.0 win-x64 压缩包。 - 发布目录未包含 coreclr.dll、hostfxr.dll、hostpolicy.dll 等 .NET 运行时文件。
4.6 KiB
4.6 KiB
Omni-Notify 开发者文档
本文档面向需要构建、修改、审查或发布 Omni-Notify 的开发者。最终用户安装和使用说明请见 README.md。
技术栈
- .NET 8
- WPF
- Windows Forms
NotifyIcon - Built-in
HttpListener - JSON 本地持久化
项目不依赖第三方 NuGet 包。
项目结构
| 文件 | 责任 |
|---|---|
App.xaml.cs |
应用生命周期、单实例互斥、托盘入口、本地 HTTP 服务启动 |
MainWindow.xaml |
主控制面板 UI |
MainWindow.xaml.cs |
频道管理、历史筛选、全局设置保存 |
Models.cs |
应用状态、频道、弹窗样式、历史记录、输入消息模型 |
Services.cs |
状态持久化、消息路由、限流熔断、本地 HTTP 接收服务 |
PopupCoordinator.cs |
弹窗队列、堆叠、替换和位置计算 |
PopupWindow.xaml |
单个弹窗窗口 UI |
PopupWindow.xaml.cs |
弹窗动画、生命周期和正文溢出处理 |
app.manifest |
Windows 应用清单,声明普通用户权限运行 |
scripts/package-release.ps1 |
标准发布脚本 |
本地构建
dotnet build .\OmniNotify.csproj -c Release
目标框架:
net8.0-windows
应用类型为 WPF 桌面应用,输出为 WinExe。
本地运行
dotnet run --project .\OmniNotify.csproj
默认监听:
http://127.0.0.1:19845/
通知接口:
POST http://127.0.0.1:19845/notify
请求体:
{
"channel": "default",
"title": "Build finished",
"body": "The nightly job completed successfully."
}
状态持久化
状态文件路径:
%LOCALAPPDATA%\OmniNotify\state.json
保存内容包括:
- 全局设置
- 频道列表和频道样式
- 历史记录
AppStore.Save 会在写入前清理超出保留天数和数量限制的历史记录。
消息处理流程
LocalHttpServer接收本地 HTTP 请求。- 请求体反序列化为
IncomingMessage。 NotificationRouter.Receive进入 UI Dispatcher。- 检查熔断状态和每秒消息上限。
- 按
channel严格匹配频道。 - 根据免打扰状态决定是否弹窗。
- 写入历史记录。
PopupCoordinator按频道样式显示弹窗。
未知频道不会弹窗,会记录为 IllegalChannel。
发布包
生成 v0.2.0 Windows x64 发布包:
.\scripts\package-release.ps1 -Version 0.2.0
默认产物:
artifacts\omni-notify-v0.2.0-win-x64.zip
脚本参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
Configuration |
Release |
构建配置 |
Version |
0.2.0 |
应用版本和产物版本 |
RuntimeIdentifier |
win-x64 |
目标运行时标识 |
发布策略
当前发布策略刻意保持透明、标准和低风险:
SelfContained=falsePublishSingleFile=falsePublishTrimmed=falsePublishReadyToRun=false--self-contained false- 不使用混淆器
- 不使用 UPX
- 不使用自解压启动器
- 不请求管理员权限
发布脚本会检查产物目录中是否出现以下 .NET 运行时文件:
coreclr.dllclrjit.dllhostfxr.dllhostpolicy.dll
如果出现这些文件,脚本会失败,避免误发布自包含运行时包。
安全敏感行为约束
v0.2.0 已删除开机自启功能。代码中不应重新引入以下行为,除非经过明确产品决策:
- 写入
HKCU\Software\Microsoft\Windows\CurrentVersion\Run - 创建计划任务实现自启动
- 后台下载或执行外部程序
- 全局键盘/鼠标钩子
- 注入、提权、隐藏进程或绕过安全产品
应用保留的本地监听服务仅绑定 127.0.0.1,不应改为 0.0.0.0 或局域网地址,除非同时补充认证和明确的安全设计。
版本与 Git
发布新版本时:
- 更新
OmniNotify.csproj中的Version、FileVersion、AssemblyVersion。 - 更新
app.manifest中的assemblyIdentity version。 - 更新文档中的示例版本号。
- 运行发布脚本生成 zip。
- 验证发布目录不包含 .NET 运行时文件。
- 提交代码。
- 创建 tag,例如
v0.2.0。 - 推送分支和 tag。
建议 tag 命名:
vMAJOR.MINOR.PATCH
建议发布资产命名:
omni-notify-vMAJOR.MINOR.PATCH-win-x64.zip
v0.2.0 发布摘要
- 删除开机自启功能及相关注册表写入逻辑。
- 新增标准应用清单,声明普通用户权限运行。
- 新增 framework-dependent 发布脚本。
- 发布包改为
omni-notify-v0.2.0-win-x64.zip。 - README 改为用户文档,开发信息迁入本文档。