
Lumafly发布全流程从dotnet publish到macOS .app打包与Windows自更新器的部署实践【免费下载链接】LumaflyA cross platform mod manager for Hollow Knight written in Avalonia.项目地址: https://gitcode.com/gh_mirrors/lu/LumaflyLumafly 是一款用 C# 和 Avalonia 编写的《空洞骑士》跨平台 Mod 管理器。本文带你完整走通它的发布流程用dotnet publish一次性构建 Windows / Linux / macOS 三平台单文件版本用 Python 脚本把二进制包进 macOS.app应用包并搭建基于 appcast 订阅源的 Windows 自更新器。一图看懂发布流水线 整条流水线由一个批处理脚本 Scripts/publish.bat 驱动核心环节如下阶段工具产物三平台构建dotnet publish单文件模式Lumafly.exe/ osx 与 linux 的LumaflymacOS 打包Scripts/make_mac_app.pymac.zip压缩发布包7zwindows.zip/linux.zip自更新器构建Lumafly.AU/publish.batLumafly.AU.exe更新订阅源Scripts/make_appcast.pyappcast.xml开始前先把仓库克隆到本地git clone https://gitcode.com/gh_mirrors/lu/Lumafly第 1 步dotnet publish 一键构建三平台publish.bat对三个 RID 各执行一次dotnet publish关键参数组合是dotnet publish -r win-x64 -p:PublishSingleFiletrue -p:ConfigurationRelease \ --self-contained true -p:IncludeNativeLibrariesForSelfExtracttrue -p:DebugTypeembedded几个值得注意的细节--self-contained true用户机器无需安装 .NET 运行时开箱即用PublishSingleFiletrue整个应用收敛为单个可执行文件便于分发和更新DebugTypeembedded调试符号直接嵌入 exe发布目录干净利落脚本开头会先清空out目录保证每次都是干净构建版本号集中在 Lumafly/Lumafly.csproj 的Version节点当前为3.3.0.0发新版只需改这一个地方再重新 publish。第 2 步Python 脚本组装 macOS .app 包macOS 要求程序装在标准 bundle 里。仓库中预置了模板目录 Scripts/Lumafly.app/Contents/Info.plist声明可执行文件名、应用图标、Retina 支持及自定义 URL 协议Info.plistContents/MacOS/可执行文件占位Contents/Resources/Lumafly.icns应用图标然后运行 Scripts/make_mac_app.py它做三件事遍历.app模板把全部文件写入mac.zip将 osx-x64 发布出的Lumafly二进制写入 zip 内的Contents/MacOS/run并把Lumafly.pdb重命名为run.pdb一并打包关键细节通过ZipInfo.external_attr 0o100755 16为 zip 条目写入-rwxr-xr-x的 Unix 权限位并标记 host 为 UNIX —— 少了这一步macOS 会拒绝执行第 3 步7z 压缩出发布包mac.zip生成后脚本再用两条7z a命令把 windows 与 linux 的 publish 目录压成windows.zip和linux.zip。三个 zip 加上下文的Lumafly.AU.exe就是一次完整发布的交付物。第 4 步打造 Windows 自更新器 Lumafly.AU设计思路很巧妙不让主程序自己替换自己而是做一个小安装器 Lumafly.AU/把新版Lumafly.exe以嵌入式资源的方式塞进去Lumafly.AU.csproj 中EmbeddedResource IncludeLumafly.exe /并且开启了PublishAot。更新器 Lumafly.AU/Program.cs 的工作流程从启动参数拼接出当前运行的 Lumafly 完整路径拼接是为了避免路径含空格被拆成多个参数把内嵌的新版 exe 写为Lumafly-Update.exe删除旧 exe再把新文件改名回原位手动运行时还会自动拉起新版应用它还内置了对旧项目名的改名兼容逻辑历史用户升级也不会断档。构建时只需把新发布的Lumafly.exe放到 csproj 旁边再跑Lumafly.AU/publish.bat即可。第 5 步用 make_appcast.py 生成 appcast 更新源Scripts/make_appcast.py 接收一个版本号参数可带v前缀在仓库根目录维护一份 RSS 2.0 格式的 appcast.xml每次发版向channel顶部插入新的itemsparkle:releaseNotesLink指向该版本的 changelog 文件enclosure指向该版本 Release 中的Lumafly.AU.exe并标注sparkle:oswindows运行时AppUpdater 下载Lumafly.AU.exe把当前 exe 路径作为参数传给安装器替换完成后自动重启全程无需用户手动操作。应用内检查更新一套代码两条路径 Lumafly/Services/AppUpdater.cs 按操作系统分流Windows接入 NetSparkleUpdater支持启动时自动检查与用户手动触发下载成功后自动安装并重启RelaunchAfterUpdate truemacOS / Linux改为「手动检查」——拉取仓库中托管的UpdateLinks.json更新链接与程序解耦换地址不用发新版比较最新 tag 与本地版本弹窗让用户选择「获取最新版」或「继续使用」兜底策略下载失败时弹出错误提示用浏览器打开下载页并退出程序保证用户总能拿到新版视频与更多资料 项目提供了视频演示帮助新用户快速上手。更新日志的完整历史见 CHANGELOG.md。发布速查清单 ✅提升 Lumafly/Lumafly.csproj 中的Version版本号更新 CHANGELOG.md 并放置到 static-resources 的 Changelogs 目录运行 Scripts/publish.bat产出out/下的三个 zip将新Lumafly.exe放入 AU 项目旁运行 Lumafly.AU/publish.bat运行make_appcast.py 版本号更新并提交 appcast.xml将Lumafly.AU.exe与三个 zip 一并上传到新版本 Release【免费下载链接】LumaflyA cross platform mod manager for Hollow Knight written in Avalonia.项目地址: https://gitcode.com/gh_mirrors/lu/Lumafly创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考