capacitor-app-upgrade-v4-to-v5 について
Capacitor 4 アプリを Capacitor 5 に移行するためのスキルです。ツールチェーンの確認、CLI 移行、iOS と Android の変更、検証項目をまとめています。
主な機能
- 01プロジェクトのバージョンと環境要件の確認
- 02CLI による移行の実行
- 03iOS と Android の設定調整
- 04公式およびコミュニティ製プラグインの更新
- 05ビルドの検証と一般的なエラーへの対応
活用シーン
- 01Capacitor 4 アプリの 5 への移行
- 02Android の 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 への更新後に、
Namespace not specified、Java 11 と 17 の不一致、または AGP 8 のエラーが原因で Android ビルドに失敗する場合。 - iOS、Android、または公式プラグイン向けの正確な 4 -> 5 チェックリストを求められた場合。
使用しない場合:
- アプリが 5.x 以降の場合 ->
capacitor-app-upgrade-v5-to-v6(その後 v6-to-v7、v7-to-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、ラッパー、マニフェスト、または 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 ラッパーが更新され、packageがnamespaceに移行され、iOS アプリアイコンのセットが縮小され、cap syncが実行されます。出力を確認してください。完了できなかった手順はすべて表示されるため、手動で対応する必要があります。 -
git diffを確認します。その後、CLI がスキップした項目をすべて完了します。- iOS:
ios/.gitignoreでApp/Podfile.lockをApp/outputに置き換えます(今後はPodfile.lockをコミットします)。必要に応じてAppIcon.appiconsetを 1024x1024 のアイコン 1 つに縮小します。 - 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、Cookie が消去されます。今のうちに値を固定すれば、将来のデータ損失を防げます。代わりにhttpsを選ぶ場合は、事前にユーザーに確認してください。
- iOS:
-
すべての公式プラグインを
^5.0.0に更新し、コミュニティプラグインを Capacitor 5 対応リリースに更新します。references/plugins.mdのコード変更を適用します。 -
Gradle ファイルに AGP 7 の設定が残っている場合は、Android Studio で
Tools -> AGP Upgrade Assistantを実行します。 -
以下の検証を実行します。
落とし穴
android.enableJetifier=trueを削除すると、依存関係に古いandroid.support.*ライブラリを使用しているものがある場合、ビルドが失敗します。まずnode_modulesとネイティブ依存関係をgrepしてください。不明な場合は Jetifier を残してください。namespaceは、古いマニフェストのpackage値と一致している必要があります。両者が異なる場合、applicationIdではありません。- Device プラグイン:
getId()は{ identifier }を返すようになり、uuidはなくなりました。iOS 16 以降では、DeviceInfo.nameはユーザーが割り当てたデバイス名のエンタイトルメントがない場合、汎用名を返します。 - Android 13(targetSdk 33):Push Notifications と 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 の該当する差分を適用してください。 |
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 が変更されています。インストール済みアプリで使用されていたスキームに戻してください(v4 のデフォルトは http です)。 |