SuperAPI AI 工具集

ota-updates

部署与运维

查看项目

更新于 10-18 18:02

技能介绍

用途

该技能用于指导并约束 React Native(Expo)应用通过 EAS Update 发布空中更新(OTA)。核心目标是确保 OTA 更新只到达与其原生层匹配的二进制包,并让发布、灰度、回滚环节可控、可核查。

主要规则与能力

  • 运行时版本采用指纹策略:在顶层使用 runtimeVersion: { policy: 'fingerprint' },不使用固定字符串或 appVersion 策略;指纹只对原生输入做哈希,fingerprint.config.js 负责把生命周期脚本(pre/post install、prepare、eas-build-*)纳入哈希,其他 npm scripts 与版本字段排除。
  • 更新配置统一:updates.url 使用项目 EAS Update 地址 https://u.expo.dev/<id>,与 extra.eas.projectId 一致;启用更新须有 URL,否则显式 updates: { enabled: false };expo-updates 必须是依赖而非 devDependency。
  • 启动不阻塞、错误恢复保留:fallbackToCacheTimeout: 0、checkAutomatically: 'ON_LOAD',不关闭反砖恢复措施,不在启动时等待网络。
  • 每个发布变体一个通道:每个发布构建 profile 的 channel 等于其变体等于环境;开发客户端不设通道;通道在构建时写入二进制。
  • 发布命令必须显式指定通道、环境与消息:使用 eas update --channel <v> --environment <v> --message "<fix>",不用 --auto。
  • 原生变更不得空中下发:新增 SDK、原生包、插件或配置变更须先发布商店构建;发布前需通过 npm run verify 与 scripts/ota/update-preflight.ts 预检。
  • 商店通道分阶段发布:首次发布使用 --rollout-percentage 1-25,依据 eas update:insights 的崩溃率再提升;预览无需灰度。
  • 禁止跨通道提升:同一提交在预览验证后,需用生产环境重新发布到生产通道,不使用 update:republish --destination-channel。
  • 回滚由人工决策:先暂停通道,仅在目标之后无数据迁移时回滚,否则前向修复;相关操作不在 CI 中执行。
  • UpdatesPort 适配层:唯一导入 expo-updates 的适配器,调用前检查 Updates.isEnabled,将特定错误码映射为禁用状态且不抛异常;更新检查在挂载及回到前台时进行(至多每小时一次),仅在用户点击后应用更新。

使用方式

技能提供模板与脚本:复制 templates/src/config/updates-config.ts 及其测试、templates/fingerprint.config.js、templates/src/services/updates/、templates/src/hooks/use-update-checks.ts、templates/scripts/ota/ 下的更新计划与预检脚本;参考 examples/ 中的 app.config、eas.json、组合根、应用根与发布工作流示例进行接线。安装命令为 npx expo install expo-updates。发布流程为:先发布商店构建,再运行预检脚本,经开发者确认后执行打印出的发布命令,并在预览机测试后按灰度发布到生产。最后从仓库根目录运行 node ${CLAUDE_SKILL_DIR}/scripts/check-ota.mjs .,修复 FAIL 项直至 RESULT: PASS。

适用场景

适用于使用 Expo 与 EAS Update 的 React Native 项目,尤其是需要区分多个发布变体、在 CI 中发布更新、需要灰度与回滚控制的团队。

限制与注意事项

  • 调试构建从开发服务器加载 JS,只有 release 构建才运行更新器,因此需在 iOS 与 Android 的 release 构建上分别验证更新路径。
  • 文档建议的 SDK 版本、expo-updates 版本号及验证日期来自资料原文,实际可用性暂未提供进一步说明。
  • 涉及发布、提升灰度、回滚或暂停的操作,均需开发者明确同意后才可执行。