本文是「告别手动发版」系列第 2 篇。
系列目录:
- 第 1 篇:总览
- 第 2 篇:VSCode 插件实战(本文)
- 第 3 篇:CLI 实战与 CI/CD 集成
- 第 4 篇:8 平台 API 踩坑实录
开始之前
安装 VSCode 扩展:市场搜索 "Flu CLI" → 安装。
打开方式:右键项目根目录 → Flu: 发布中心

三种发布模式
发布中心顶部有三个模式标签,按需选择:

| 模式 | 谁用 | 做什么 |
|---|---|---|
| 🏗️ 仅构建 | Flutter 开发者 | 编译出 APK/IPA,不上传 |
| 🚀 全量流水线 | Flutter 开发者 | 编译 + 上传一气呵成 |
| 📦 仅上传 | 所有 App 开发者 | 有安装包直接传,不限框架 |
重点:如果你不是 Flutter 开发者,直接用"仅上传"模式。 打开发布中心后,如果检测到当前项目不是 Flutter 项目,界面会自动精简------模式标签和构建配置直接隐藏,只留上传相关的操作。
实战一:仅上传模式(所有开发者通用)
这是受众最广的模式。不管你用什么框架,只要有安装包就能用。
Step 1:选择安装包

选文件的一瞬间,工具自动做了这些事:
| 格式 | 自动解析 | 用什么解析 |
|---|---|---|
| APK | 包名 + 版本号 + 构建号 | aapt2 dump badging |
| IPA | Bundle ID + 版本号 + 构建号 | plutil 解析 Info.plist |
| HAP | Bundle Name + 版本号 | 解压读 module.json |
不用手动填版本号,选文件就行。
Flutter 项目额外福利
如果你是 Flutter 项目,还有一个 "⚡ 一键同步" 按钮:
一个按钮做三件事:
- 从
pubspec.yaml读取包名和版本号 - 加载上次保存的密钥配置
- 扫描
build/目录,找到已编译的安装包
外部包自动识别
测试同事扔给你一个别人编译的 APK,包名和当前项目不一样------
界面自动切换:
- 出现 "⚠️ 外部包模式" 标签
- 工程设置隐藏(外部包不需要工程配置)
- 版本号从安装包里解析,不读当前项目的
pubspec.yaml
删掉外部包后,界面自动切回工程模式。全程不需要手动切换。
Step 2:选择分发渠道

勾选你要上传的平台,右侧清单栏实时更新。
Step 3:配置密钥
这是第一次使用时最花时间的一步------但只需要配一次。

每个平台一张折叠卡片,展开后:
- 输入框标注了需要填什么(Client ID、Secret 等)
- ❓ 帮助按钮------点一下告诉你密钥在哪个后台、哪个页面申请,附官方文档链接
- 保存方式三选一:
| 方式 | 存在哪 | 下次还在吗 | 适合 |
|---|---|---|---|
| ⚡ 仅本次 | 内存 | 关掉就没了 | 临时测试 |
| 📁 保存至本地 | 项目配置文件 | 在 | 日常使用(默认) |
| 🌍 全局默认 | ~/.flu-cli/config.json |
在,且跨项目 | 多项目共享密钥 |
密钥存在本地,不提交 Git,不上传服务器。下次打开发布中心,自动加载。
各平台需要什么密钥
| 平台 | 需要填什么 | 在哪申请 |
|---|---|---|
| 蒲公英 | API Key | pgyer.com/account/api |
| 华为 | App ID + Client ID + Client Secret | AGC 控制台 → 用户与权限 → API 客户端 |
| 小米 | 邮箱 + 公钥证书 | 小米开放平台 → 发布管理 → 自动发布设置 |
| OPPO | Client ID + Client Secret | OPPO 开放平台 → 管理中心 → 应用详情 |
| vivo | Access Key + Access Secret | vivo 开放平台 → 管理中心 → API 接入 |
| 应用宝 | App ID + App Key | 腾讯开放平台 → 应用基本信息 |
| App Store | Apple ID + App 专用密码 | appleid.apple.com |
| 鸿蒙 | Client ID + Client Secret | 同华为 |
这些信息,每个平台的 ❓ 帮助按钮点一下就能看到。不用收藏这个表。
Step 4:开始上传
点击"开始执行任务",界面切换到 Dashboard 看板:
左侧------每个平台一张任务卡片:
css
📤 上传任务
┌────────────────────────────┐
│ 🚀 蒲公英 [完成] │
│ 🤖 Android ✅ 已上传 │
├────────────────────────────┤
│ 🏪 华为 [上传中] │
│ 🤖 Android ████████░ 85% │
├────────────────────────────┤
│ 🏪 小米 [上传中] │
│ 🤖 Android ██████░░░ 60% │
├────────────────────────────┤
│ 🏪 OPPO [等待中] │
│ 🤖 Android ░░░░░░░░ 0% │
└────────────────────────────┘
右侧------动态详情面板,根据阶段自动切换。
底部------实时日志:
erlang
📤 将要上传到 4 个渠道
✅ 蒲公英上传完成 → 下载链接已生成
⬆️ 华为上传中 85%...
⬆️ 小米上传中 60%...
✅ 华为上传完成
✅ 小米上传完成
✅ OPPO 上传完成
🎉 全部上传完成!4/4 成功
Step 5:获取结果

上传完成后,结果面板显示:
- 📊 成功/失败统计
- 🔗 各平台下载链接 + 📋 一键复制
- 🏪 前往后台 --- 跳转到对应平台管理后台
- 🔍 查看二维码 --- 蒲公英专属
- 📋 一键复制所有链接 --- 全部链接打包复制,直接发群里
复制链接,丢群里,收工。
实战二:全量流水线模式(Flutter 专属)
Flutter 开发者的一条龙服务:编译 → 上传。
Step 1:配置
配置面板包含:
- 📁 工程设置 --- 点"⚡ 一键同步"自动读取
pubspec.yaml - 🏗️ 构建平台 --- 勾选 Android / iOS
- 📝 版本策略 --- 保持 / 修订 / 次版本 / 主版本
- 🌎 分发渠道 --- 勾选要上传的平台
- 🔑 密钥配置 --- 折叠式卡片,按需展开
- 📝 更新日志 --- 支持按平台自定义
版本号递增策略:
| 策略 | 当前 1.0.0+1 的结果 |
|---|---|
| 保持不变 | 1.0.0+1 |
| 修订版本 (Patch) | 1.0.1+2 |
| 次版本 (Minor) | 1.1.0+2 |
| 主版本 (Major) | 2.0.0+2 |
Step 2:构建 → 确认 → 上传
点击"开始执行任务"后:
css
选平台 + 选渠道 + 填版本号 → 开始
↓
🏗️ 编译(实时进度条)
↓
✅ 编译完成 → "是否开始上传?" [取消] [确认]
↓
📤 并行上传到所有渠道
↓
📊 结果汇总
编译完会停下来问你------万一编译成功了但你发现忘改什么东西,可以中断不传。不是无脑一路到底。
实战三:仅构建模式(Flutter 专属)
只编译出安装包,不上传。适合:
- 先验证能不能编译通过
- 出包给测试手动安装
- 出包后稍后再用"仅上传"模式传
界面只保留构建相关的配置,分发渠道区直接隐藏。
失败了怎么办
单个平台失败
其他平台不受影响。失败的卡片变红,显示具体错误信息 + 🔄 重试按钮。
点一下只重试那一个,不用全部重来。
自动重试策略
底层内置了智能重试:
| 错误类型 | 会自动重试吗 | 说明 |
|---|---|---|
| 网络超时、连接拒绝 | ✅ 会 | 等 1s → 2s → 4s,最多 3 次 |
| 服务器 500/502/503 | ✅ 会 | 指数退避 + 随机抖动 |
| 限流 429 | ✅ 会 | 等待后重试 |
| 认证失败 401/403 | ❌ 不会 | 密钥错了,重试没意义 |
| 参数错误 400 | ❌ 不会 | 请求本身有问题 |
网络抖动不用管,工具自己会重试。密钥错了会直接告诉你,不浪费时间。
非 Flutter 项目的界面
如果你在一个非 Flutter 项目目录下打开发布中心:

- 模式标签消失(构建用不了,所以不显示)
- 工程设置消失(没有
pubspec.yaml) - 只留核心操作:选文件 → 选渠道 → 配密钥 → 上传
界面越简单,上手越快。
上传后各平台会发生什么
建议收藏这张表,发版前看一眼:
| 平台 | 上传后 | 你还需要做什么 |
|---|---|---|
| 蒲公英 | 直接可下载,生成二维码 | 分享链接即可 |
| 华为 | 默认存草稿(可配自动提审) | 去后台确认后提审,或配置 submit |
| 鸿蒙 | 同华为 | 同华为 |
| 小米 | 直接提交审核 | 确认包没问题再传(无草稿状态) |
| 应用宝 | 直接提交审核 | 确认包没问题再传(无草稿状态) |
| OPPO | 包和版本信息已提交 | 建议去后台确认后提审 |
| vivo | 包和版本信息已提交 | 建议去后台确认后提审 |
| App Store | IPA 传到 App Store Connect | 去后台选版本、填信息、提审 |
小米和应用宝没有草稿状态,上传即提审------确认包没问题再传。
配置文件:flu_release.yaml
如果你喜欢用配置文件管理(方便团队共享、CI/CD 场景),可以在项目根目录创建 flu_release.yaml:
yaml
# 构建配置
build:
android:
type: apk # apk | appbundle
flavor: # 可选:应用风味
buildName: '1.0.0'
buildNumber: '1'
ios:
scheme: Runner
exportMethod: app-store # app-store | development | ad-hoc
teamId: # 可选
# 发布配置
publish:
pgyer:
enable: true
apiKey: 'your-api-key'
huawei:
enable: true
appId: 'your-app-id'
auth:
clientId: 'xxx'
clientSecret: 'xxx'
releaseType: draft # draft(草稿)| submit(直接提审)
xiaomi:
enable: true
auth:
userName: 'xxx@example.com'
privateKey: '/path/to/private.pem'
app_store:
enable: true
auth:
appleId: 'xxx@xxx.com'
appPassword: 'app-specific-password'
# 重试策略
retry:
maxRetries: 3
initialDelayMs: 1000
backoffMultiplier: 2
发布中心会自动加载这个文件,配置文件和可视化界面可以混用------文件里写了密钥,界面里就自动填上了。
小结
| 操作 | 传统方式 | 发布中心 |
|---|---|---|
| 上传 8 个平台 | 逐个登录后台,2 小时 | 勾选 + 一键,10 分钟 |
| 密钥管理 | 到处找,经常忘 | 配一次,自动加载 |
| 构建 + 上传 | 手动跑命令 + 手动传 | 一条龙,中间可暂停确认 |
| 失败处理 | 全部重来 | 单个重试 |
| 非 Flutter 项目 | 一样要逐个传 | 选文件直接传 |
下一篇预告
不喜欢 GUI?喜欢命令行?想集成到 CI/CD?
下一篇讲 app-ship CLI ------npm install -g app-ship,一行命令传 8 个平台。
觉得有用?
- 👍 点赞 --- 让更多被发版折磨的人看到
- ⭐ 收藏 --- 下个发版日翻出来用
- 💬 评论 --- 说说你被哪个平台折磨过
关注公众号「火叶」,第一时间获取系列更新和实战干货。回复 "flu" 加入开发者交流群。
「告别手动发版」系列 · 第 2 篇
完整文档 · 源码仓库 · VSCode 插件市场 · app-ship npm
公众号:火叶 · 交流群:微信 Huoye-TT 备注 "flu-cli"