一、写在前面
好久不见~
最近把自己本地使用的一套 Flutter 打包发布流程 整理了一下,做成了一个开源小工具,名字叫 Open Release Pilot。
项目地址:
GitHub 主页:
如果你平时也会遇到这些问题:
- Flutter Android 怎么做多渠道打包?
- Flutter 怎么批量生成小米、华为、应用宝、蒲公英等渠道包?
- Flutter iOS 怎么打 IPA?
- iOS IPA 怎么上传 App Store Connect 或 TestFlight?
- Android 包怎么上传蒲公英?
- 应用市场发布参数、更新说明、审核备注怎么统一管理?
- 打包记录、上传记录怎么保存在本地?
- 测试同事要包时,怎么快速扫码安装?
那这个工具可能刚好适合你。
它不是 Jenkins,也不是 GitHub Actions 这种完整 CI/CD 平台,而是一个更轻量的 本地发布工作台。
很多 Flutter 项目在发布阶段其实还是本机打包、本机确认、再上传应用市场。流程不复杂,但每次都要重复敲命令、找包、改文件名、复制更新日志、打开不同平台后台,就很容易出错。
Open Release Pilot 主要就是把这些重复工作放到一个本地 Web 面板里。
二、这个工具能做什么
Open Release Pilot 是一个面向 Flutter App 的本地可视化发布控制台,核心能力包括:
- Flutter 项目配置管理
- Android 多渠道打包
- Android APK 输出目录和命名模板管理
- iOS IPA 构建
- App Store Connect / TestFlight 上传参数管理
- 蒲公英上传
- 华为、小米、应用宝、荣耀、OPPO、vivo 等应用市场发布配置
- 发布说明和审核备注管理
- 本地构建记录、上传记录保存
- 局域网扫码安装 APK
- 亮色、暗色、跟随系统主题切换
项目是一个本地 Node 服务,前端是静态 HTML/CSS/ES Modules,没有引入复杂框架,也不需要部署数据库。
本地数据默认保存在:
data/projects-db.json
data/release-db.json
这些文件默认已经被 .gitignore 忽略,不会提交到 GitHub。
三、先看一下界面
3.1 打包工作台
打包工作台主要用于查看当前项目、版本号、输出目录、Android 渠道包状态、iOS IPA 状态,也可以直接启动 Android 打包或 iOS 构建。
Android 这里可以选择渠道,比如蒲公英、小米、华为、应用宝等。
每个渠道会单独显示构建进度和日志,打包完成后可以看到 APK 路径。
3.2 分发管理
分发管理主要用于维护各个平台的发布参数。
比如:
- 蒲公英 API Key
- APK 路径
- 应用市场 App ID
- 包名
- 发布说明
- 审核备注
- 测试账号
- 图标和截图路径
- 是否上传后提交审核
这里不是把所有平台都强行做成完全自动化,而是先把发布参数集中管理起来。
能走 API 的平台就走 API,暂时还需要人工确认的流程也可以作为发布清单来维护。
3.3 项目管理
项目管理是整个工具的基础。
这里可以配置多个 Flutter / Android 项目,每个项目都有自己的:
- 项目根目录
- 版本文件
- 版本号匹配规则
- 构建号匹配规则
- Android 输出目录
- iOS 输出目录
- APK 命名模板
- IPA 命名模板
- Android 渠道列表
- iOS 发布配置
- 应用市场配置
也就是说,如果你手里维护多个 Flutter App,不需要改代码切来切去,直接在页面里切换项目就可以。
四、安装和启动
项目地址:
拉取项目:
git clone https://github.com/langyuxiansheng/open-release-pilot.git
cd open-release-pilot
启动:
npm start
启动成功后,终端会输出类似下面的地址:
Open Release Pilot: http://127.0.0.1:8787
Open Release Pilot LAN: http://192.168.1.10:8787
浏览器打开本机地址就可以使用。
如果端口被占用,可以换一个端口:
./start.sh --port 8788
查看端口状态:
./start.sh --status
停止服务:
./start.sh --stop
如果你只想本机访问,不想让局域网其它设备访问,可以这样启动:
HOST=127.0.0.1 npm start
五、第一次使用怎么配置
第一次打开页面后,先不要急着打包。
建议按这个顺序配置:
5.1 进入项目管理
把默认示例项目改成你自己的 Flutter 项目。
主要配置这些字段:
项目名称
项目根目录
应用短名
版本文件
版本号正则
构建号正则
Android 输出目录
iOS 输出目录
APK 命名模板
IPA 命名模板
渠道列表
Flutter 默认版本文件一般是:
android/local.properties
里面通常有:
flutter.versionName=1.0.0
flutter.versionCode=1
如果你的项目版本号不是从这里读,也可以在页面里修改版本文件和正则。
5.2 配置 Android 渠道
渠道配置类似这样:
[
{ "code": "PGYER", "dir": "pgyer", "name": "蒲公英" },
{ "code": "XIAOMI", "dir": "小米", "name": "小米" },
{ "code": "HUAWEI", "dir": "华为", "name": "华为" },
{ "code": "SJQQ", "dir": "sjqq", "name": "应用宝" }
]
其中:
code是打包时传入的渠道值dir是输出目录name是页面展示名称
Android 打包脚本会执行:
flutter build apk --release --dart-define="TAG_CHANNEL=${CHANNEL}"
所以你的 Flutter 项目里可以这样读取渠道:
const channel = String.fromEnvironment('TAG_CHANNEL');
如果你的项目暂时不需要区分渠道,也可以先不处理这个值。
5.3 配置输出文件名
APK 命名模板支持:
{appSlug}
{versionName}
{versionCode}
{channel}
例如:
{appSlug}-{versionName}-{versionCode}-{channel}.apk
输出后大概是:
demo_app-1.0.0-1-XIAOMI.apk
iOS IPA 模板支持:
{appSlug}
{versionName}
{versionCode}
例如:
{appSlug}-{versionName}-{versionCode}.ipa
六、Android 多渠道打包流程
配置好项目后,进入「打包工作台」。
勾选需要构建的渠道,然后点击 Android 构建。
脚本会进入目标 Flutter 项目目录,每个渠道执行一次构建。
构建完成后,会把 APK 复制到:
{androidOutputRoot}/{versionName}/{channel.dir}/{apkNameTemplate}
例如:
~/Desktop/AndroidPackages/1.0.0/xiaomi/demo_app-1.0.0-1-XIAOMI.apk
这里有一个比较实用的逻辑:
如果目标渠道包已经存在,并且文件不是空的,脚本会自动跳过这个渠道。
比如打包到一半失败了,下次重新执行时,不需要全部从头开始。
如果想强制重打某个渠道,可以先在页面里删除对应 APK,再重新构建。
七、iOS IPA 构建和 TestFlight
iOS 这块目前支持三种模式:
| 模式 | 说明 |
|---|---|
| 仅打包 IPA | 只构建 IPA,不上传 |
| 上传到 App Store Connect | 打包后上传到 App Store Connect |
| 上传并用于 TestFlight | 上传后等待 Apple 处理,再到 TestFlight 配置测试 |
iOS 脚本执行的是:
flutter build ipa --export-options-plist="$IOS_EXPORT_OPTIONS_PLIST"
构建成功后,会把 IPA 复制到:
{iosOutputRoot}/{versionName}/{ipaNameTemplate}
iOS 这里需要注意的东西比较多:
- Xcode 要配置好
- 证书要正确
- 描述文件要匹配
- Bundle ID 要匹配
- Team ID 要正确
- ExportOptions plist 要和发布类型一致
- App Store Connect API Key 要有效
.p8私钥路径只能放本机
如果这些基础环境没配好,工具只能把错误日志展示出来,不能绕过 Apple 的签名和上传规则。
八、应用市场配置和上传
Open Release Pilot 目前内置了这些平台:
| 平台 | 当前状态 |
|---|---|
| 蒲公英 | 打包后上传流程已可用于实际发布 |
| 华为 | 已接入 API 流程,建议先用测试应用验证 |
| 小米 | 已接入自动发布字段和签名逻辑,建议先预检 |
| 应用宝 | 主要面向已上线应用的信息和包更新 |
| 荣耀 | 已接入 API 更新流程,提交审核前需要确认字段 |
| OPPO | 已接入 API 更新流程,分类、素材、联系人字段要填全 |
| vivo | 已接入 API 更新流程,版本号、包名、素材和签名要严格匹配 |
这里单独说明一下:
当前项目还在持续完善中,有些应用市场的字段和流程可能还不是最终形态。
目前 Android 打包流程 和 蒲公英发布流程 是已经可以正常使用的,其它平台虽然已经接入了不少 API 流程和配置项,但不同账号的权限、后台字段、审核规则会有差异,正式使用前建议先用测试应用验证。
我个人建议的发布顺序是:
- 先填写基础字段,但保持
enabled=false。 - 填 APK 路径、包名、App ID、发布说明。
- 执行查询或预检,确认账号和应用能匹配。
- 再打开
enabled。 - 第一次先关闭
submitForReview,只做上传或更新。 - 去平台后台确认状态正常后,再决定是否提交审核。
这样比较稳,不容易因为字段没填全或者包传错而直接进入审核。
九、本地数据和敏感信息
这个项目定位是本地工具,所以会在本机保存一些配置和记录。
主要文件如下:
| 文件 | 说明 | 是否提交 |
|---|---|---|
config/stores.example.json | 开源示例配置 | 可以提交 |
config/stores.local.json | 本机私有配置 | 不要提交 |
data/projects-db.json | 项目配置和市场配置 | 不要提交 |
data/release-db.json | 构建记录和上传记录 | 不要提交 |
.gitignore 已经默认忽略这些本地数据。
但是如果你 fork 之后要公开发布,还是建议自己检查一下:
git status --short
git check-ignore -v config/stores.local.json data/projects-db.json data/release-db.json
还可以搜索一下自己的真实信息,比如:
包名
App ID
Team ID
API Key
手机号
测试账号
公司域名
本机私有路径
开源项目里一定不要提交真实证书、真实密钥和真实账号。
十、适合哪些人使用
我觉得这个工具比较适合这些场景:
- Flutter 项目需要本机打包发布
- Android 有多个渠道包
- 需要固定输出目录和文件名
- 发布前需要人工确认包和说明
- 需要上传蒲公英给测试安装
- 应用市场字段比较多,希望统一记录
- 不想为了发布工具再部署数据库和后台服务
- 一个开发者维护多个 Flutter App
如果你的团队已经有完整 CI/CD,例如 Jenkins、GitLab CI、GitHub Actions、Fastlane 全套自动化,那这个工具可能不是替代品。
它更适合作为本地发布辅助面板,尤其适合还在从手工发布过渡到自动化发布的项目。
十一、注意事项
这里再简单汇总一下使用注意事项:
- 不要把发布面板暴露到公网。
- 不要提交本地
data/*.json。 - 不要提交
config/stores.local.json。 - 不要提交
.p8、.p12、.mobileprovision、.jks、.keystore、.cer等文件。 - 局域网扫码安装只建议在可信网络使用。
- Android 打包前确认目标项目自己能执行
flutter build apk --release。 - iOS 打包前确认 Xcode、证书、描述文件、ExportOptions plist 都正确。
- 应用市场上传前确认包名、版本号、签名、App ID、API 权限。
- 第一次接入应用市场 API 时,建议先用测试应用验证。
submitForReview这类提交审核开关不要一上来就打开。
十二、写在后面
Open Release Pilot 目前已经开源:
项目还在继续完善中,后续会继续补充更多应用市场发布流程、字段校验和文档说明。
如果你也在做 Flutter 打包发布、Android 多渠道打包、iOS IPA 构建、蒲公英上传或者应用市场发布相关工作,可以 clone 下来试一下。
有问题可以在 GitHub 提 Issue,也可以留言交流。
感谢您的阅读,如果此文章或项目对您有帮助,请扫个二维码点个关注吧,若可以的话再给个一键三连吧!
公众号阅读的朋友可以点一下右下角的 在看 和 分享 哦。
GitHub 有开源项目,需要的小伙伴可以顺手 star 一下!
GitHub: github.com/langyuxians…