关于 capacitor-app-upgrade-v4-to-v5
面向 Capacitor 4 应用的迁移技能,指导项目升级到 Capacitor 5。提供工具链检查、CLI 迁移步骤、iOS 与 Android 调整及验证清单。
主要功能
- 01检查项目版本与工具链要求
- 02运行 CLI 自动迁移
- 03调整 iOS 与 Android 配置
- 04更新官方及社区插件
- 05验证构建并处理常见错误
适用场景
- 01将 Capacitor 4 应用升级到 5
- 02处理 Android namespace 或 Java 版本错误
- 03检查插件变更和升级后的数据保留
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cap-go/ capgo-skills --skill capacitor-app-upgrade-v4-to-v5安装后在 Claude Code 中输入/capacitor-app-upgrade-v4-to-v5确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
metadata.jsonreferences/android.mdplugins.md详细介绍
Capacitor 应用从 v4 升级到 v5
将 Capacitor 4 应用迁移到 Capacitor 5。权威来源:https://capacitorjs.com/docs/updating/5-0
适用场景
- 下方快照中的
@capacitor/core为4.x,且用户希望升级到5.x。 - 升级到 Capacitor 5 后 Android 构建失败,并出现
Namespace not specified、Java 11 与 17 不匹配或 AGP 8 错误。 - 用户需要 iOS、Android 或官方插件从 4 升级到 5 的具体检查清单。
请勿用于:
- 应用已使用 5.x 或更高版本 → 使用
capacitor-app-upgrade-v5-to-v6(然后依次升级 v6 到 v7、v7 到 v8)。多阶段升级规划 →capacitor-app-upgrades。 - 升级插件库 → 使用
capacitor-plugin-upgrade-v4-to-v5。 - 应用使用 3.x → 先升级到 4(在 5.x 中,
npx cap migrate不接受低于 4 的项目)。
实时项目快照
package.json 中当前的 Capacitor 包:
!node -e "const fs=require('fs');if(!fs.existsSync('package.json'))process.exit(0);const pkg=JSON.parse(fs.readFileSync('package.json','utf8'));const out=[];for(const section of ['dependencies','devDependencies']){for(const [name,version] of Object.entries(pkg[section]||{})){if(name.startsWith('@capacitor/'))out.push(section+'.'+name+'='+version)}}console.log(out.sort().join('\n'))"
参考资料
仅在涉及相应主题时加载参考资料。
| 文件 | 加载时机 |
|---|---|
references/android.md | 手动编辑 variables.gradle、build.gradle、wrapper、manifest 或 Kotlin 时 |
references/plugins.md | 应用使用官方 @capacitor/* 插件(Camera、Device、Push、Local Notifications、Google Maps 等)时 |
升级前检查
修改文件前先检查并报告。如果缺少任何最低要求,请要求用户先升级工具链。
| 工具 | Capacitor 5 的最低要求 |
|---|---|
| Node.js | 16+(建议使用最新 LTS 版本) |
| Xcode | 14.1+ |
| Android Studio | Flamingo 2022.2.1+(附带 JDK 17) |
| Java(Gradle JDK) | 17 |
| AGP / Gradle | 8.0.0 / 8.0.2 |
| Android SDK | minSdk 22,compileSdk 33,targetSdk 33 |
| iOS 部署目标 | 13.0(与 v4 相同) |
node -v
xcodebuild -version
java -version
git status --short # start from a clean tree so the migration diff is reviewable
流程
-
根据快照确认
@capacitor/core为 4.x。如果低于 4,请停止并先转到 3 → 4 升级流程。 -
运行自动迁移:
npm i -D @capacitor/cli@latest-5 npx cap migrate该命令会升级
@capacitor/*包、更新variables.gradle、AGP 和 Gradle wrapper,将package移至namespace,精简 iOS 应用图标集,并运行cap sync。阅读输出:所有未能自动完成的步骤都会列出,必须手动完成。 -
检查
git diff。然后完成 CLI 跳过的所有事项:- iOS:在
ios/.gitignore中将App/Podfile.lock替换为App/output(从现在起提交Podfile.lock)。也可以将AppIcon.appiconset精简为单个 1024x1024 图标。 - Android:应用
references/android.md中的变量表和差异(AGP 8.0.0、Gradle 8.0.2、google-services 4.3.15、namespace、Jetifier、Kotlin 1.8.20)。 - 配置:如果未设置
server.androidScheme,请在capacitor.config.*中添加androidScheme: "http"。Capacitor 6 会将默认值改为https,这会改变 WebView 来源,并清除 localStorage、IndexedDB 和 cookies。现在固定该值可避免日后数据丢失。若要改用https,请先征求用户同意。
- iOS:在
-
将所有官方插件更新到
^5.0.0,并将社区插件更新到其 Capacitor 5 版本。应用references/plugins.md中的代码更改。 -
在 Android Studio 中,如果 Gradle 文件仍显示 AGP 7 的残留配置,请运行
Tools -> AGP Upgrade Assistant。 -
运行下方的验证步骤。
常见陷阱
- 移除
android.enableJetifier=true会导致构建失败,前提是仍有依赖使用旧版android.support.*库。请先搜索node_modules和原生依赖;如果不确定,请保留 Jetifier。 namespace必须与旧清单中的package值一致;如果两者不同,则不能使用applicationId。- 设备插件:
getId()现在返回{ identifier };uuid已移除。在 iOS 16+ 上,如果没有用户指定设备名称的 entitlement,DeviceInfo.name会返回通用名称。 - Android 13(targetSdk 33):Push 和 Local Notifications 需要在运行时调用
checkPermissions()/requestPermissions(),否则不会显示任何内容。
验证
grep -rn "package=" android/app/src/main/AndroidManifest.xml # expect no package attribute
grep -n "namespace" android/app/build.gradle # expect namespace "<id>"
grep -n "gradle:8.0.0\|google-services" android/build.gradle
grep -n "distributionUrl" android/gradle/wrapper/gradle-wrapper.properties # gradle-8.0.2
grep -n "SdkVersion" android/variables.gradle # 22 / 33 / 33
grep -rn "androidScheme" capacitor.config.* # explicit value present
grep -rn "\.uuid\b" src/ # no Device uuid leftovers
npx cap sync
cd android && ./gradlew assembleDebug
然后在 Xcode 14.1+ 中构建 iOS(或运行 npx cap run ios),并启动两个平台。确认存储的数据(登录信息、localStorage)在升级后仍然保留。
错误处理
| 错误 | 解决方法 |
|---|---|
Migrate can only be used on capacitor 4 and above, please use the CLI in Capacitor 4 to upgrade to 4 first | 项目使用的是 3.x。请先升级到 4。 |
Capacitor 5 requires JDK 17 or higher. Some steps may fail. | 将 Gradle JDK 设置为 17(Android Studio Settings -> Build Tools -> Gradle),然后重新运行。 |
Unable to find <file>. Try updating it manually | 应用 references/android.md 中对应的 diff。 |
Found namespace in build.gradle already, skipping migration | 这是提示信息。只需确认清单中不再包含 package=。 |
Namespace not specified(Gradle) | 在出错模块的 android {} 块中添加 namespace "<package id>"。对于第三方插件,请将其更新到 Capacitor 5 版本。 |
Android Gradle plugin requires Java 17 to run. You are currently using Java 11. | 将 Gradle JDK 切换为 17。 |
| 升级后 Android 上数据丢失 / 已退出登录 | androidScheme 已更改。将其恢复为已安装应用使用的 scheme(v4 默认值为 http)。 |