版本目标化
复制一个包含安装步骤和本插件的完整 Markdown 指南的配置提示。
本指南解释了如何根据用户的本机应用程序版本自动将最新兼容的捆绑包传递给用户, 类似于 Ionic AppFlow 的方法. 这样可以简化更新管理和快速发布,同时防止兼容性问题。
获取逐步迁移指示。
概述Capgo’s version targeting system allows you to:
- 自动为用户提供兼容的更新 根据用户的本机应用程序版本
- 防止破坏性更改 到不兼容的应用程序版本
- 同时管理多个应用程序版本 不需要复杂的逻辑
- 无缝地向特定用户段发布更新 为什么版本目标定位很重要(尤其是AppFlow用户)
标题:为什么版本目标定位很重要(尤其是AppFlow用户)
如果您熟悉Ionic AppFlow If you’re familiar with __CAPGO_KEEP_0__,您知道确保用户只接收兼容更新是多么重要吗? AppFlow 自动匹配了实时更新包到本机应用程序版本,防止向较旧的本机 code 发送不兼容的 JavaScript。
Capgo 提供相同的安全保证, with additional features:
- 具有额外功能:
- 更细致的版本匹配控制
- 多个策略(通道、语义版本、native约束)
- API and CLI control alongside dashboard management
__CAPGO_KEEP_0__ 和 __CAPGO_KEEP_1__ 控制与仪表盘管理
- 这种方法在以下情况下尤其有用:
- 您有用户在应用程序的不同主要版本上(例如 v1.x、v2.x、v3.x)
- You want to prevent newer bundles from breaking older native code
- 您希望防止新包破坏较旧的本机 __CAPGO_KEEP_0__
- You’re migrating from AppFlow 并且希望保持相同的更新安全性
How It Works
How It WorksCapgo 使用多层次的方法来匹配用户与兼容的更新:
- Native Version Constraints: 防止不兼容的本机版本接收更新包
- Channel-Based Routing: 将不同应用程序版本路由到不同的更新通道
- Semantic Versioning Controls: 自动阻止更新跨越主/次/修订版本边界
- Device-Level Overrides: 目标特定设备或用户组
版本匹配流程
版本匹配流程graph TD A[User Opens App] --> B{Check Device Override} B -->|Override Set| C[Use Override Channel] B -->|No Override| D{Check defaultChannel in App} D -->|Has defaultChannel| E[Use App's defaultChannel] D -->|No defaultChannel| F[Use Cloud Default Channel] C --> G{Check Version Constraints} E --> G F --> G G -->|Compatible| H[Deliver Update] G -->|Incompatible| I[Skip Update]策略 1:基于通道的版本路由
基于通道的版本路由这是 推荐的方法 用于管理破坏性更改和主要版本更新。它类似于 AppFlow 的交付模型。
示例场景
示例场景- App v1.x (100,000用户) →
production频道 - App v2.x (50,000用户带有破坏性更改) →
v2频道 - App v3.x (10,000 beta用户) →
v3频道
实施
实施第1步:为每个主要版本配置频道
第1步:为每个主要版本配置频道// capacitor.config.ts for version 1.x buildsimport { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = { appId: 'com.example.app', appName: 'Example App', plugins: { CapacitorUpdater: { autoUpdate: 'atBackground', defaultChannel: 'production', // or omit for default } }};
export default config;// capacitor.config.ts for version 2.x buildsconst config: CapacitorConfig = { appId: 'com.example.app', appName: 'Example App', plugins: { CapacitorUpdater: { autoUpdate: 'atBackground', defaultChannel: 'v2', // Routes v2 users automatically } }};// capacitor.config.ts for version 3.x buildsconst config: CapacitorConfig = { appId: 'com.example.app', appName: 'Example App', plugins: { CapacitorUpdater: { autoUpdate: 'atBackground', defaultChannel: 'v3', // Routes v3 users automatically } }};步骤 2:创建频道
步骤 2:创建频道# Create channels for each major versionnpx @capgo/cli channel create productionnpx @capgo/cli channel create v2npx @capgo/cli channel create v3
# Enable self-assignment so apps can switch channelsnpx @capgo/cli channel set production --self-assignnpx @capgo/cli channel set v2 --self-assignnpx @capgo/cli channel set v3 --self-assign步骤 3:上传版本特定捆绑包
步骤 3:上传版本特定捆绑包# For v1.x users (from v1-maintenance branch)git checkout v1-maintenancenpm run buildnpx @capgo/cli bundle upload --channel production
# For v2.x users (from v2-maintenance or main branch)git checkout mainnpm run buildnpx @capgo/cli bundle upload --channel v2
# For v3.x users (from beta/v3 branch)git checkout betanpm run buildnpx @capgo/cli bundle upload --channel v3标题:好处
零代码修改- Zero code changes 清晰的分离
- - 每个版本都有自己的更新管道 灵活的目标
- - 将更新推送到特定版本组 安全的滚动发布
- Zero __CAPGO_KEEP_0__ changes - 不兼容版本不会接收到破坏性变化
策略 2:语义版本控制
标题:策略 2:语义版本控制使用 Capgo 内置的 语义版本控制 来防止跨版本边界的更新。
禁用重大版本之间的自动更新
标题:禁用重大版本之间的自动更新# Create a channel that blocks major version updatesnpx @capgo/cli channel create stable --disable-auto-update major这意味着:
- 应用程序版本的用户 1.2.3 将会接收更新至 1.9.9
- 用户将 不会 不会自动接收版本 2.0.0 自动
- 防止破坏性变化到达较旧的本机code
细粒度控制选项
标题:细粒度控制选项# Block minor version updates (1.2.x won't get 1.3.0)npx @capgo/cli channel set stable --disable-auto-update minor
# Block patch updates (1.2.3 won't get 1.2.4)npx @capgo/cli channel set stable --disable-auto-update patch
# Allow all updatesnpx @capgo/cli channel set stable --disable-auto-update noneStrategy 3: Native Version Constraints
Strategy 3: 原生版本约束Specify minimum native version requirements for bundles to prevent delivery to incompatible devices.
在上传包时,您可以指定最低的原生版本:
When uploading a bundle, you can specify a minimum native version:Terminal window
# This bundle requires native version 2.0.0 or highernpx @capgo/cli bundle upload \ --channel production \ --native-version "2.0.0"使用场景
使用场景-
需要新本机插件
终端窗口 # Bundle needs Camera plugin added in v2.0.0npx @capgo/cli bundle upload --native-version "2.0.0" -
本机 API 变更
终端窗口 # Bundle uses new Capacitor 6 APIsnpx @capgo/cli bundle upload --native-version "3.0.0" -
渐进式迁移
终端窗口 # Test bundle only on latest native versionnpx @capgo/cli bundle upload \--channel beta \--native-version "2.5.0"
策略 4:防止自动降级
策略 4:防止自动降级防止用户接收比他们当前本机版本更旧的捆绑包。
在频道设置中启用
在频道设置中启用在Capgo控制台中:
- 前往 频道 → 选择您的频道
- 启用 “在原生下禁用自动降级”
- 保存更改
或通过 CLI:
npx @capgo/cli channel set production --disable-downgrade示例
标题:示例- 用户设备:原生版本 1.2.5
- 渠道包:版本 1.2.3
- 结果: 更新被阻止(将会降级)
这在以下情况下很有用:
- 用户手动从应用商店安装了更新版本
- 您需要确保用户始终拥有最新的安全补丁
- 您想防止回归错误
策略 5:设备级别目标
标题:策略 5:设备级别目标为特定设备或用户组重写渠道分配
强制特定版本用于测试
标题:强制特定版本用于测试import { CapacitorUpdater } from '@capgo/capacitor-updater'
// Force beta testers to use v3 channelasync function assignBetaTesters() { const deviceId = await CapacitorUpdater.getDeviceId()
// Check if user is beta tester if (isBetaTester(userId)) { await CapacitorUpdater.setChannel({ channel: 'v3' }) }}设备控制台重写
标题:设备控制台重写在 Capgo 控制台中:
- 前往 设备 → 查找设备
- 点击 设置频道 或 设置版本
- 使用特定的频道或捆绑版本覆盖
- 设备将从覆盖源接收更新
完整的AppFlow-Style工作流程
标题:完整的AppFlow-Style工作流程以下是一个完整的示例,结合了所有策略:
1. 初始设置(App v1.0.0)
标题:1. 初始设置(App v1.0.0)# Create production channel with semver controlsnpx @capgo/cli channel create production \ --disable-auto-update major \ --disable-downgradeconst config: CapacitorConfig = { plugins: { CapacitorUpdater: { autoUpdate: 'atBackground', defaultChannel: 'production', } }};2. 发布破坏性更改(App v2.0.0)
标题:2. 发布破坏性更改(App v2.0.0)# Create v2 channel for new versionnpx @capgo/cli channel create v2 \ --disable-auto-update major \ --disable-downgrade \ --self-assign
# Create git branch for v1 maintenancegit checkout -b v1-maintenancegit push origin v1-maintenance// capacitor.config.ts for v2.0.0const config: CapacitorConfig = { plugins: { CapacitorUpdater: { autoUpdate: 'atBackground', defaultChannel: 'v2', // New users get v2 channel } }};3. 将更新推送到两种版本
标题:3. 将更新推送到两种版本# Update v1.x users (bug fix)git checkout v1-maintenance# Make changesnpx @capgo/cli bundle upload \ --channel production \ --native-version "1.0.0"
# Update v2.x users (new feature)git checkout main# Make changesnpx @capgo/cli bundle upload \ --channel v2 \ --native-version "2.0.0"4. 监控版本分布
标题:4. 监控版本分布使用 Capgo 面板来跟踪:
- v1 和 v2 用户数量
- 每个版本的包装采用率
- 每个版本的错误或崩溃次数
5. 废弃旧版本
标题:5. 废弃旧版本当 v1 使用量低于阈值时:
# Stop uploading to production channel# Optional: Delete v1 maintenance branchgit branch -d v1-maintenance
# Move all remaining users to default# (They'll need to update via app store)通道顺序
标题:通道顺序当存在多个通道配置时,Capgo 使用以下顺序:
- 设备覆盖 (控制台或 API) - 优先级最高
- 云覆盖 通过
setChannel()呼叫 - 默认频道 在 capacitor.config.ts 中
- 默认频道 (Cloud 设置) - 优先级最低
最佳实践
最佳实践1. 总是为主要版本设置defaultChannel
Section titled “1. 总是为主要版本设置defaultChannel for Major Versions”// ✅ Good: Each major version has explicit channel// v1.x → production// v2.x → v2// v3.x → v3
// ❌ Bad: Relying on dynamic channel switching// All versions → production, switch manually2. 使用语义版本
Section titled “2. 使用语义版本ing”# ✅ Good1.0.0 → 1.0.1 → 1.1.0 → 2.0.0
# ❌ Bad1.0 → 1.1 → 2 → 2.53. 保持单独的分支
Section titled “3. 保持单独的分支es”# ✅ Good: Separate branches per major versionmain (v3.x)v2-maintenance (v2.x)v1-maintenance (v1.x)
# ❌ Bad: Single branch for all versions4. 在发布前进行测试
第 4 节:在发布前进行测试# Test on beta channel firstnpx @capgo/cli bundle upload --channel beta
# Monitor for issues, then promote to productionnpx @capgo/cli bundle upload --channel production5. 监控版本分布
第 5 节:监控版本分布定期检查您的仪表板:
- 用户是否正在升级到新版本的原生版本?
- 老版本是否仍然获得高流量?
- 您是否应该弃用旧渠道?
与 Ionic AppFlow 的比较
第 6 节:与 Ionic AppFlow 的比较对于从 Ionic AppFlow, here’s how Capgo’s version targeting compares:
| Capgo | 的版本目标化功能与 | Capgo |
|---|---|---|
| 相比: | 功能 | Ionic AppFlow defaultChannel Capgo |
| 基于本地版本的自动化 | 基于语义版本号的自动化 | 高级 --disable-auto-update (主/次/修) |
| 原生版本约束 | 在 AppFlow 控制台中进行手动配置 | 内置 --native-version CLI 中的标志 |
| 频道管理 | Web UI + CLI | Web UI + CLI + API |
| 设备覆盖 | 有限的设备级控制 | 通过控制台/API 进行全控制 |
| __CAPGO_KEEP_0__ | 是 | 通过 --disable-downgrade |
| __CAPGO_KEEP_0__ | 手动管理分支/频道 | 自动管理,频道优先 |
| 自主托管 | 否 | 是(完全控制) |
| __CAPGO_KEEP_0__ | 基本 | 详细每个版本指标 |
故障排除
故障排除用户未接收更新
用户未接收更新检查以下内容:
-
频道分配: 确认设备位于正确的频道
const channel = await CapacitorUpdater.getChannel()console.log('Current channel:', channel) -
版本约束: 检查是否有本地版本要求
- 仪表盘 → 包 → 检查“本地版本”列
-
Semver 设置: 验证渠道的
disable-auto-update设置终端窗口 npx @capgo/cli channel list -
设备覆盖: 检查设备是否有手动覆盖
- 仪表盘 → 设备 → 搜索设备 → 检查渠道/版本
版本不正确的包
版本不正确的包- Review defaultChannel: 确保正确的渠道
capacitor.config.ts - 检查包上传: 验证包是否上传到正确的渠道
- 检查原生版本: 确认标志是否使用正确
--native-version影响旧版本的重大变更
影响旧版本的重大变更
立即修复- Check Bundle Upload: Override affected devices to safe bundle
- 仪表盘 → 设备 → 批量选择 → 设置版本
- 长期修复: Create versioned channels and maintain separate branches
- : 预防措施: 在代表性设备上始终测试更新之前进行滚动
从 Ionic AppFlow 迁移
从 Ionic AppFlow 迁移如果您正在从 Ionic AppFlow 迁移, 版本目标在 __CAPGO_KEEP_0__ 中与 Ionic AppFlow 类似,但具有改进的灵活性:, version targeting works very similarly in Capgo, with improved flexibility:
Migration from Ionic AppFlow
Section titled “概念映射”| AppFlow Concept | Capgo Equivalent | Notes |
|---|---|---|
| 发布渠道 | Capgo Channel | 相同概念,更加强大 |
| 原生版本锁定 | --native-version 标志 | 更细致的控制 |
| 渠道优先级 | 渠道顺序(override → 云 → 默认) | 更透明的顺序 |
| 部署目标 | 频道 + semver 控制 | 可用的多种策略 |
| 生产频道 | production 频道 (或任意名称) | 灵活的命名 |
| 基于 Git 的部署 | CLI 从分支上传打包 | 相同的工作流 |
| 自动版本匹配 | defaultChannel + 版本约束 | 增强了多种策略 |
AppFlow 用户的关键差异
标题:AppFlow 用户的关键差异- 更多控制: Capgo 给您多种策略(通道、语义版本、原生版本)可组合
- 更好的可见性: 控制台显示版本分布和兼容性问题
- API 访问: 对版本目标的完全编程控制
- 自主托管: 可以使用相同的版本逻辑运行自己的更新服务器
迁移步骤
迁移步骤- 映射 AppFlow 通道 到 Capgo 通道(通常 1:1)
- 设置
defaultChannel在capacitor.config.ts每个主要版本 - 配置 semver 规则 如果您想要在版本边界处自动阻止
- 使用 标志
--native-version监控版本分布 - 使用 在 Capgo 控制台
高级模式
标题为“高级模式”按版本逐步部署
标题为“按版本逐步部署”// Gradually migrate v1 users to v2async function migrateUsers() { const deviceId = await CapacitorUpdater.getDeviceId() const rolloutPercentage = 10 // Start with 10%
// Hash device ID to get deterministic percentage const hash = hashCode(deviceId) % 100
if (hash < rolloutPercentage) { // User is in rollout group - migrate to v2 await CapacitorUpdater.setChannel({ channel: 'v2' }) }}按版本的功能标志
标题为“按版本的功能标志”// Enable features based on native versionasync function checkFeatureAvailability() { const info = await CapacitorUpdater.getDeviceId() const nativeVersion = info.nativeVersion
if (compareVersions(nativeVersion, '2.0.0') >= 0) { // Enable features requiring v2.0.0+ enableNewCameraFeature() }}版本之间的A/B测试
标题:版本之间的A/B测试// Run A/B tests within same native versionasync function assignABTest() { const nativeVersion = await getNativeVersion()
if (nativeVersion.startsWith('2.')) { // Only A/B test on v2 users const variant = Math.random() < 0.5 ? 'v2-test-a' : 'v2-test-b' await CapacitorUpdater.setChannel({ channel: variant }) }}摘要
标题:摘要Capgo 提供多种版本特定更新分发策略:
- 基于频道的路由:通过
defaultChannel - 语义版本控制:防止更新跨越主/次/修订版本边界
- 原生版本约束: Require minimum native version for bundles
- Auto-Downgrade Prevention: Never deliver older bundles to newer native versions
- Device Overrides: 手动控制测试和目标
通过结合这些策略,您可以实现AppFlow-style自动更新交付,具有更大的灵活性和控制。选择最适合您的应用版本和部署工作流程的方法。
有关具体功能的更多详细信息:
- Breaking Changes Guide -详细的通道版本策略
- Channel Management -完整的通道配置参考
- Update Behavior - 原生版本延迟和条件
从版本目标继续
标题:从版本目标继续如果您正在使用 版本目标 来规划渠道路由和阶段性发布,连接它与 渠道 查看渠道的实施细节在 渠道 查看渠道的实施细节在 渠道 查看渠道的实施细节在 Beta 测试解决方案 __CAPGO_KEEP_0__ 版本目标解决方案 __CAPGO_KEEP_0__