@huoye/app-ship 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +503 -0
- package/dist/cli.js +4298 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +4167 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1304 -0
- package/dist/index.d.ts +1304 -0
- package/dist/index.js +4118 -0
- package/dist/index.js.map +1 -0
- package/package.json +89 -0
package/README.md
ADDED
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
# App Ship
|
|
2
|
+
|
|
3
|
+
多平台应用商店上传引擎 — CLI 命令行工具 & npm 库,支持 APK / IPA / AAB / HAP 一键分发。
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@huoye/app-ship)
|
|
6
|
+
[](https://www.npmjs.com/package/@huoye/app-ship)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
|
|
9
|
+
**Languages**: [English](README_EN.md) | 简体中文
|
|
10
|
+
|
|
11
|
+
## 特性
|
|
12
|
+
|
|
13
|
+
- **8 大平台实测通过** ✅:蒲公英、华为、小米、OPPO、vivo、腾讯应用宝、App Store、鸿蒙
|
|
14
|
+
- **并行上传**:多平台同时上传,可配置并发数
|
|
15
|
+
- **智能分发**:自动路由 APK → Android 商店、IPA → Apple、HAP → 鸿蒙
|
|
16
|
+
- **指数退避重试**:网络波动自动重试,可配置退避策略
|
|
17
|
+
- **YAML 单配置**:一个配置文件管理所有平台凭据
|
|
18
|
+
- **三种使用方式**:CLI 命令行、npm 库、VSCode 插件
|
|
19
|
+
- **框架无关**:Flutter、React Native、原生 Android/iOS、鸿蒙均可使用
|
|
20
|
+
|
|
21
|
+
## 安装
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# 全局安装 CLI
|
|
25
|
+
npm install -g @huoye/app-ship
|
|
26
|
+
|
|
27
|
+
# 作为项目依赖
|
|
28
|
+
npm install @huoye/app-ship
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 快速开始
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# 1. 安装
|
|
35
|
+
npm install -g @huoye/app-ship
|
|
36
|
+
|
|
37
|
+
# 2. 初始化配置
|
|
38
|
+
app-ship init
|
|
39
|
+
|
|
40
|
+
# 3. 上传
|
|
41
|
+
app-ship upload -c app-ship.yaml -f app.apk
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 三种使用方式
|
|
45
|
+
|
|
46
|
+
### 1. CLI 命令行
|
|
47
|
+
|
|
48
|
+
适合 DevOps、CI/CD 流水线和命令行用户。
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# 初始化配置文件
|
|
52
|
+
app-ship init
|
|
53
|
+
|
|
54
|
+
# 上传到所有启用的平台
|
|
55
|
+
app-ship upload -c app-ship.yaml -f app-release.apk
|
|
56
|
+
|
|
57
|
+
# 仅上传到指定平台
|
|
58
|
+
app-ship upload -c app-ship.yaml -f app-release.apk --platform pgyer,huawei
|
|
59
|
+
|
|
60
|
+
# 带元数据上传
|
|
61
|
+
app-ship upload -c app-ship.yaml -f app-release.apk \
|
|
62
|
+
--version 2.0.0 \
|
|
63
|
+
--build-number 42 \
|
|
64
|
+
--changelog "修复了已知问题"
|
|
65
|
+
|
|
66
|
+
# 查看支持的平台
|
|
67
|
+
app-ship platforms
|
|
68
|
+
|
|
69
|
+
# 查看帮助
|
|
70
|
+
app-ship --help
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**CLI 参数说明**:
|
|
74
|
+
|
|
75
|
+
| 参数 | 简写 | 说明 |
|
|
76
|
+
| -------------------- | ---- | ---------------------------------------------------------- |
|
|
77
|
+
| `--config <path>` | `-c` | 配置文件路径 (YAML) |
|
|
78
|
+
| `--file <path>` | `-f` | 安装包路径 (APK/IPA/AAB/HAP) |
|
|
79
|
+
| `--platform <list>` | `-p` | 逗号分隔的平台列表(可选,不填则使用配置文件中启用的平台) |
|
|
80
|
+
| `--version <ver>` | `-v` | 版本号(默认:配置文件中的值或 "1.0.0") |
|
|
81
|
+
| `--build-number <n>` | `-b` | 构建号(默认:"1") |
|
|
82
|
+
| `--changelog <text>` | | 更新日志 |
|
|
83
|
+
| `--verbose` | | 显示详细输出 |
|
|
84
|
+
|
|
85
|
+
### 2. npm 库(编程集成)
|
|
86
|
+
|
|
87
|
+
适合自建发布系统或集成到现有工作流。
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
import { UploadManager, ConfigValidator } from '@huoye/app-ship'
|
|
91
|
+
|
|
92
|
+
// 加载并验证配置
|
|
93
|
+
const config = ConfigValidator.loadAndValidate('./app-ship.yaml')
|
|
94
|
+
|
|
95
|
+
// 创建上传管理器
|
|
96
|
+
const manager = new UploadManager({
|
|
97
|
+
maxConcurrent: 3, // 最大并发数
|
|
98
|
+
continueOnError: true, // 部分失败后继续
|
|
99
|
+
verbose: true, // 显示详细日志
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
// 执行上传
|
|
103
|
+
const report = await manager.uploadToMultiplePlatforms('./app-release.apk', config, {
|
|
104
|
+
version: '2.0.0',
|
|
105
|
+
buildNumber: '42',
|
|
106
|
+
changelog: '修复了已知问题',
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
// 查看结果
|
|
110
|
+
console.log(`成功: ${report.successCount}, 失败: ${report.failureCount}`)
|
|
111
|
+
console.log(`总耗时: ${report.totalDurationMs}ms`)
|
|
112
|
+
|
|
113
|
+
// 遍历每个平台的结果
|
|
114
|
+
for (const result of report.results) {
|
|
115
|
+
if (result.success) {
|
|
116
|
+
console.log(`✅ ${result.platform}: ${result.url || result.consoleUrl}`)
|
|
117
|
+
} else {
|
|
118
|
+
console.log(`❌ ${result.platform}: ${result.message}`)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**单平台上传示例**:
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
import { PgyerUploader } from '@huoye/app-ship'
|
|
127
|
+
|
|
128
|
+
const uploader = new PgyerUploader()
|
|
129
|
+
const result = await uploader.upload(
|
|
130
|
+
'./app-release.apk',
|
|
131
|
+
{ enable: true, apiKey: 'YOUR_API_KEY' },
|
|
132
|
+
{ version: '1.0.0', buildNumber: '1', changelog: '首次发布' },
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
if (result.success) {
|
|
136
|
+
console.log(`下载地址: ${result.url}`)
|
|
137
|
+
console.log(`二维码: ${result.qrCode}`)
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 3. VSCode 插件(可视化)
|
|
142
|
+
|
|
143
|
+
安装 **Flu CLI** VSCode 插件,在 IDE 内点击操作即可完成构建和上传。
|
|
144
|
+
|
|
145
|
+
功能:
|
|
146
|
+
|
|
147
|
+
- 实时构建 & 上传进度展示
|
|
148
|
+
- 可视化配置面板
|
|
149
|
+
- 自动密钥管理
|
|
150
|
+
- 下载链接 + 二维码展示
|
|
151
|
+
|
|
152
|
+
详见 [VSCode 插件文档](https://gitee.com/flu-cli/flu-cli/tree/main/packages/vscode-extension#readme)。
|
|
153
|
+
|
|
154
|
+
## 支持平台
|
|
155
|
+
|
|
156
|
+
| 平台 | 文件类型 | 认证方式 | 状态 |
|
|
157
|
+
| -------------------- | -------- | ------------------ | ----------- |
|
|
158
|
+
| 蒲公英 (Pgyer) | APK, IPA | API Key | ✅ 已实测 |
|
|
159
|
+
| 华为 (Huawei) | APK, AAB | OAuth2 | ✅ 已实测 |
|
|
160
|
+
| 小米 (Xiaomi) | APK | RSA 公钥签名 | ✅ 已实测 |
|
|
161
|
+
| OPPO | APK | HMAC-SHA256 | ✅ 已实测 |
|
|
162
|
+
| vivo | APK | HMAC-SHA256 + MD5 | ✅ 已实测 |
|
|
163
|
+
| 腾讯应用宝 (Tencent) | APK | HMAC-SHA256 | ✅ 已实测 |
|
|
164
|
+
| App Store | IPA | Apple ID / API Key | ✅ 已实测 |
|
|
165
|
+
| 鸿蒙 (Harmony) | HAP | OAuth2 | ✅ 已实测 |
|
|
166
|
+
| TestFlight | IPA | Apple API Key | ⚠️ 框架就绪(开发中) |
|
|
167
|
+
| Ad Hoc | IPA | 签名证书 | ⚠️ 框架就绪(开发中) |
|
|
168
|
+
| Google Play | APK, AAB | Service Account | 🔄 计划中(v0.2.0) |
|
|
169
|
+
|
|
170
|
+
## 完整配置参考
|
|
171
|
+
|
|
172
|
+
`app-ship.yaml` 完整结构:
|
|
173
|
+
|
|
174
|
+
```yaml
|
|
175
|
+
version: '1.0.0'
|
|
176
|
+
|
|
177
|
+
# 重试策略(可选)
|
|
178
|
+
retry:
|
|
179
|
+
maxRetries: 3 # 最大重试次数
|
|
180
|
+
initialDelayMs: 1000 # 初始延迟 (毫秒)
|
|
181
|
+
backoffMultiplier: 2 # 指数退避乘数
|
|
182
|
+
maxDelayMs: 30000 # 最大延迟 (毫秒)
|
|
183
|
+
|
|
184
|
+
publish:
|
|
185
|
+
# ── 蒲公英 ──
|
|
186
|
+
pgyer:
|
|
187
|
+
enable: true
|
|
188
|
+
apiKey: '${PGYER_API_KEY}' # 支持环境变量
|
|
189
|
+
description: '测试版本'
|
|
190
|
+
|
|
191
|
+
# ── 华为 AppGallery ──
|
|
192
|
+
huawei:
|
|
193
|
+
enable: false
|
|
194
|
+
auth:
|
|
195
|
+
clientId: '${HUAWEI_CLIENT_ID}'
|
|
196
|
+
clientSecret: '${HUAWEI_CLIENT_SECRET}'
|
|
197
|
+
appId: 'YOUR_APP_ID'
|
|
198
|
+
releaseType: draft # draft = 仅上传 | submit = 提交审核
|
|
199
|
+
# apiBaseUrl: '' # 可选:指定区域 API
|
|
200
|
+
|
|
201
|
+
# ── 小米 ──
|
|
202
|
+
xiaomi:
|
|
203
|
+
enable: false
|
|
204
|
+
auth:
|
|
205
|
+
userName: 'your@email.com' # 开发者账号邮箱
|
|
206
|
+
privateKey: '${XIAOMI_KEY}' # API 访问密码(非登录密码)
|
|
207
|
+
# publicKeyPath: './rsa.cer' # 可选:RSA 公钥文件
|
|
208
|
+
packageName: 'com.example.app'
|
|
209
|
+
|
|
210
|
+
# ── OPPO ──
|
|
211
|
+
oppo:
|
|
212
|
+
enable: false
|
|
213
|
+
auth:
|
|
214
|
+
clientId: '${OPPO_CLIENT_ID}'
|
|
215
|
+
clientSecret: '${OPPO_CLIENT_SECRET}'
|
|
216
|
+
|
|
217
|
+
# ── vivo ──
|
|
218
|
+
vivo:
|
|
219
|
+
enable: false
|
|
220
|
+
auth:
|
|
221
|
+
accessKey: '${VIVO_ACCESS_KEY}'
|
|
222
|
+
accessSecret: '${VIVO_ACCESS_SECRET}'
|
|
223
|
+
|
|
224
|
+
# ── 腾讯应用宝 ──
|
|
225
|
+
tencent:
|
|
226
|
+
enable: false
|
|
227
|
+
auth:
|
|
228
|
+
userId: '${TENCENT_USER_ID}' # 开发者用户 ID
|
|
229
|
+
appId: '${TENCENT_APP_ID}' # 应用 ID
|
|
230
|
+
accessSecret: '${TENCENT_SECRET}' # 接入密钥
|
|
231
|
+
|
|
232
|
+
# ── 鸿蒙 ──
|
|
233
|
+
harmony:
|
|
234
|
+
enable: false
|
|
235
|
+
auth:
|
|
236
|
+
clientId: '${HARMONY_CLIENT_ID}'
|
|
237
|
+
clientSecret: '${HARMONY_CLIENT_SECRET}'
|
|
238
|
+
appId: 'YOUR_APP_ID'
|
|
239
|
+
|
|
240
|
+
# ── App Store / TestFlight / Ad Hoc ──
|
|
241
|
+
app_store:
|
|
242
|
+
enable: false
|
|
243
|
+
mode: app_store # app_store | testflight | adhoc
|
|
244
|
+
auth:
|
|
245
|
+
appleId: '${APPLE_ID}' # Apple ID 邮箱
|
|
246
|
+
appPassword: '${APP_PASSWORD}' # App 专用密码
|
|
247
|
+
# API Key 认证(可选,用于自动更新发行说明):
|
|
248
|
+
# apiKeyId: ''
|
|
249
|
+
# apiIssuerId: ''
|
|
250
|
+
# privateKeyPath: './AuthKey.p8'
|
|
251
|
+
|
|
252
|
+
# ── Google Play(计划中)──
|
|
253
|
+
google_play:
|
|
254
|
+
enable: false
|
|
255
|
+
auth:
|
|
256
|
+
serviceAccountJsonPath: './service-account.json'
|
|
257
|
+
packageName: 'com.example.app'
|
|
258
|
+
track: production # internal | alpha | beta | production
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### 环境变量
|
|
262
|
+
|
|
263
|
+
配置值支持 `${VAR_NAME}` 语法引用环境变量,避免敏感信息硬编码:
|
|
264
|
+
|
|
265
|
+
```yaml
|
|
266
|
+
pgyer:
|
|
267
|
+
enable: true
|
|
268
|
+
apiKey: ${PGYER_API_KEY} # 运行时自动替换
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## 目录架构
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
packages/app-ship/
|
|
275
|
+
├── src/
|
|
276
|
+
│ ├── index.ts # 📦 库入口 — 导出所有公共 API
|
|
277
|
+
│ ├── cli.ts # 🖥️ CLI 入口 — 命令行工具主程序
|
|
278
|
+
│ ├── types.ts # 📐 类型定义 — 所有接口和类型
|
|
279
|
+
│ ├── adapters/ # 🔌 上传适配器层
|
|
280
|
+
│ │ ├── index.ts # 适配器统一导出
|
|
281
|
+
│ │ ├── pgyer_uploader.ts # 蒲公英 — API Key 认证
|
|
282
|
+
│ │ ├── huawei_uploader.ts # 华为 — OAuth2 三步上传
|
|
283
|
+
│ │ ├── xiaomi_uploader.ts # 小米 — RSA 1024 分段加密
|
|
284
|
+
│ │ ├── oppo_uploader.ts # OPPO — HMAC-SHA256 签名
|
|
285
|
+
│ │ ├── vivo_uploader.ts # vivo — HMAC-SHA256 + MD5
|
|
286
|
+
│ │ ├── tencent_uploader.ts # 腾讯应用宝 — COS 直传
|
|
287
|
+
│ │ ├── apple_store_uploader.ts # App Store — Transporter/altool
|
|
288
|
+
│ │ ├── harmony_uploader.ts # 鸿蒙 — 复用华为 AGC API
|
|
289
|
+
│ │ ├── testflight_uploader.ts # TestFlight — 半成品
|
|
290
|
+
│ │ └── adhoc_uploader.ts # Ad Hoc — 半成品
|
|
291
|
+
│ ├── utils/ # 🔧 工具层
|
|
292
|
+
│ │ ├── index.ts # 工具统一导出
|
|
293
|
+
│ │ ├── upload-manager.ts # 上传管理器 — 并发调度 + 智能分发
|
|
294
|
+
│ │ ├── retry-strategy.ts # 重试策略 — 指数退避 + 错误分类
|
|
295
|
+
│ │ ├── apple-jwt-generator.ts # Apple JWT — ES256 签名生成
|
|
296
|
+
│ │ ├── package-parser.ts # 包解析器 — APK/AAB 信息提取
|
|
297
|
+
│ │ └── logger.ts # 日志工具 — 仅内部使用,不对外导出
|
|
298
|
+
│ └── validators/ # ✅ 验证层
|
|
299
|
+
│ ├── index.ts # 验证器统一导出
|
|
300
|
+
│ ├── config_validator.ts # 配置验证 — YAML 加载 + Schema 校验
|
|
301
|
+
│ └── env_validator.ts # 环境变量验证
|
|
302
|
+
├── dist/ # 构建产物
|
|
303
|
+
├── package.json
|
|
304
|
+
├── tsconfig.json
|
|
305
|
+
└── tsup.config.ts
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### 分层架构图
|
|
309
|
+
|
|
310
|
+
```
|
|
311
|
+
┌─────────────────────────────────────────────────────┐
|
|
312
|
+
│ 用户界面层 │
|
|
313
|
+
├───────────┬──────────────────┬───────────────────────┤
|
|
314
|
+
│ CLI │ VSCode 插件 │ npm 库集成 │
|
|
315
|
+
│ (cli.ts) │ (另一个包) │ (index.ts) │
|
|
316
|
+
└─────┬─────┴────────┬─────────┴──────────┬────────────┘
|
|
317
|
+
│ │ │
|
|
318
|
+
▼ ▼ ▼
|
|
319
|
+
┌─────────────────────────────────────────────────────┐
|
|
320
|
+
│ 配置管理层 │
|
|
321
|
+
│ ConfigValidator — YAML 解析 + 环境变量替换 + 校验 │
|
|
322
|
+
│ EnvValidator — 环境变量存在性检查 │
|
|
323
|
+
└─────────────────────┬───────────────────────────────┘
|
|
324
|
+
│
|
|
325
|
+
▼
|
|
326
|
+
┌─────────────────────────────────────────────────────┐
|
|
327
|
+
│ 上传管理层 │
|
|
328
|
+
│ UploadManager │
|
|
329
|
+
│ ├── 适配器注册与查找 │
|
|
330
|
+
│ ├── 并发控制 (maxConcurrent) │
|
|
331
|
+
│ ├── 智能分发 (APK→Android, IPA→Apple, HAP→鸿蒙) │
|
|
332
|
+
│ └── 结果聚合 → UploadReport │
|
|
333
|
+
└─────────────────────┬───────────────────────────────┘
|
|
334
|
+
│
|
|
335
|
+
▼
|
|
336
|
+
┌─────────────────────────────────────────────────────┐
|
|
337
|
+
│ 平台适配器层 (IUploader) │
|
|
338
|
+
├────────┬────────┬────────┬────────┬────────┬────────┤
|
|
339
|
+
│ Pgyer │ Huawei │ Xiaomi │ Apple │ Harmony│ ... │
|
|
340
|
+
└────────┴────────┴────────┴────────┴────────┴────────┘
|
|
341
|
+
│
|
|
342
|
+
▼
|
|
343
|
+
┌─────────────────────────────────────────────────────┐
|
|
344
|
+
│ 基础设施层 │
|
|
345
|
+
│ RetryStrategy — 指数退避 + 错误分类 │
|
|
346
|
+
│ AppleJWTGenerator — ES256 JWT 签名 │
|
|
347
|
+
│ Logger — 彩色日志输出 │
|
|
348
|
+
└─────────────────────────────────────────────────────┘
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
## 自定义开发指南
|
|
352
|
+
|
|
353
|
+
### 新增一个平台适配器
|
|
354
|
+
|
|
355
|
+
只需 3 步即可添加新的上传平台:
|
|
356
|
+
|
|
357
|
+
**第 1 步:实现 `IUploader` 接口**
|
|
358
|
+
|
|
359
|
+
在 `src/adapters/` 下创建新文件,例如 `my_platform_uploader.ts`:
|
|
360
|
+
|
|
361
|
+
```typescript
|
|
362
|
+
import { IUploader, UploadResult, AppMetadata } from '../types.js'
|
|
363
|
+
|
|
364
|
+
export class MyPlatformUploader implements IUploader {
|
|
365
|
+
name = 'my_platform'
|
|
366
|
+
|
|
367
|
+
// 验证配置是否完整
|
|
368
|
+
validateConfig(config: any): boolean {
|
|
369
|
+
return config?.enable && config?.auth?.apiKey
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// 判断是否支持该文件类型
|
|
373
|
+
canHandle(filePath: string): boolean {
|
|
374
|
+
return filePath.endsWith('.apk')
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// 执行上传
|
|
378
|
+
async upload(filePath: string, config: any, metadata: AppMetadata): Promise<UploadResult> {
|
|
379
|
+
try {
|
|
380
|
+
// ... 你的上传逻辑
|
|
381
|
+
return {
|
|
382
|
+
platform: this.name,
|
|
383
|
+
success: true,
|
|
384
|
+
message: '上传成功',
|
|
385
|
+
url: 'https://...',
|
|
386
|
+
}
|
|
387
|
+
} catch (error: any) {
|
|
388
|
+
return {
|
|
389
|
+
platform: this.name,
|
|
390
|
+
success: false,
|
|
391
|
+
message: error.message || '上传失败',
|
|
392
|
+
error,
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
**第 2 步:注册适配器**
|
|
400
|
+
|
|
401
|
+
在 `src/adapters/index.ts` 中添加导出:
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
export * from './my_platform_uploader.js'
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
然后在 `src/utils/upload-manager.ts` 的 `registerBuiltinUploaders()` 中注册:
|
|
408
|
+
|
|
409
|
+
```typescript
|
|
410
|
+
this.registerUploader('my_platform', new MyPlatformUploader())
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
**第 3 步:添加配置类型**
|
|
414
|
+
|
|
415
|
+
在 `src/types.ts` 的 `UploadConfig.publish` 中添加平台配置:
|
|
416
|
+
|
|
417
|
+
```typescript
|
|
418
|
+
my_platform?: {
|
|
419
|
+
enable: boolean
|
|
420
|
+
auth: {
|
|
421
|
+
apiKey: string
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
完成!新平台将自动被 `UploadManager` 管理,支持并行上传和重试。
|
|
427
|
+
|
|
428
|
+
### 关键接口说明
|
|
429
|
+
|
|
430
|
+
| 接口 | 文件 | 用途 |
|
|
431
|
+
| -------------- | -------- | ---------------------------------- |
|
|
432
|
+
| `IUploader` | types.ts | 所有上传适配器必须实现的接口 |
|
|
433
|
+
| `UploadConfig` | types.ts | YAML 配置文件的完整类型定义 |
|
|
434
|
+
| `AppMetadata` | types.ts | 上传时附带的应用元数据 |
|
|
435
|
+
| `UploadResult` | types.ts | 每个平台上传后的统一返回格式 |
|
|
436
|
+
| `BuildResult` | types.ts | 构建结果(Android/iOS 构建器使用) |
|
|
437
|
+
|
|
438
|
+
### 文件功能速查
|
|
439
|
+
|
|
440
|
+
| 文件 | 功能 | 修改场景 |
|
|
441
|
+
| ------------------------ | -------------- | ---------------------------- |
|
|
442
|
+
| `types.ts` | 所有接口定义 | 新增平台配置字段、扩展返回值 |
|
|
443
|
+
| `cli.ts` | CLI 入口 | 新增命令、修改参数 |
|
|
444
|
+
| `upload-manager.ts` | 并行调度 | 调整并发策略、修改分发逻辑 |
|
|
445
|
+
| `retry-strategy.ts` | 重试机制 | 调整退避参数、新增错误分类 |
|
|
446
|
+
| `config_validator.ts` | 配置校验 | 新增平台必填项验证规则 |
|
|
447
|
+
| `apple-jwt-generator.ts` | JWT 签名 | 仅 Apple 平台相关 |
|
|
448
|
+
| `package-parser.ts` | APK/AAB 解析 | 扩展包信息提取 |
|
|
449
|
+
| `adapters/*.ts` | 各平台上传逻辑 | 修复 API 变更、调整上传流程 |
|
|
450
|
+
|
|
451
|
+
### 本地开发
|
|
452
|
+
|
|
453
|
+
```bash
|
|
454
|
+
# 安装依赖
|
|
455
|
+
npm install
|
|
456
|
+
|
|
457
|
+
# 构建
|
|
458
|
+
npm run build # 等效于 tsup
|
|
459
|
+
|
|
460
|
+
# 开发模式(监听文件变化)
|
|
461
|
+
npm run dev
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
## 常见问题
|
|
465
|
+
|
|
466
|
+
### 如何获取各平台的 API Key?
|
|
467
|
+
|
|
468
|
+
- **蒲公英**: 登录 [pgyer.com](https://www.pgyer.com) → 账号设置 → API 信息
|
|
469
|
+
- **华为**: [AppGallery Connect](https://developer.huawei.com/consumer/cn/service/josp/agc/index.html) → 我的项目 → 项目设置 → 密钥管理
|
|
470
|
+
- **小米**: [小米开放平台](https://dev.mi.com/console/) → 应用管理 → 应用详情 → 上传接口
|
|
471
|
+
- **OPPO/vivo/腾讯**: 对应开发者平台 → 应用管理 → API 管理
|
|
472
|
+
|
|
473
|
+
### 配置文件支持环境变量吗?
|
|
474
|
+
|
|
475
|
+
支持!使用 `${VAR_NAME}` 语法:
|
|
476
|
+
|
|
477
|
+
```yaml
|
|
478
|
+
pgyer:
|
|
479
|
+
apiKey: '${PGYER_API_KEY}'
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
### 上传失败如何排查?
|
|
483
|
+
|
|
484
|
+
1. 使用 `--verbose` 参数查看详细日志
|
|
485
|
+
2. 检查网络连接和各平台服务状态
|
|
486
|
+
3. 确认 API Key 和权限配置正确
|
|
487
|
+
4. 查看 [Issues](https://gitee.com/flu-cli/flu-cli/issues) 是否有类似问题
|
|
488
|
+
|
|
489
|
+
## 🤝 社区
|
|
490
|
+
|
|
491
|
+
扫描下方二维码或搜索公众号**火叶**关注我们
|
|
492
|
+
|
|
493
|
+
| 关注公众号 | 加作者微信入群 | 赞赏支持 |
|
|
494
|
+
| :------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------: |
|
|
495
|
+
| <img src="https://gitee.com/flu-cli/flu-cli/raw/main/packages/vscode-extension/images/qcode-wx.png" alt="微信号" width="160"/> <br> **火叶** | <img src="https://gitee.com/flu-cli/flu-cli/raw/main/packages/vscode-extension/images/wechat-group.png" alt="微信号" width="160"/> <br> **微信**: `Huoye-TT`<br>(备注: `flu-cli`) | [给作者加鸡腿 ☕️](http://huozhiye.cn/flu-cli/advanced/rewards/rewards) |
|
|
496
|
+
|
|
497
|
+
> 💡 你也可以点击插件详情页顶部的 **Sponsor** 按钮来支持本项目。
|
|
498
|
+
|
|
499
|
+
---
|
|
500
|
+
|
|
501
|
+
## License
|
|
502
|
+
|
|
503
|
+
MIT | Copyright © 2025-2026 火叶工作室
|