📦💨 CocoaPodsからSwift Package Managerに移行する
Swift Package ManagerはAppleが公式に提供しているライブラリ管理ツールです。
そのため、CocoaPodsやCarthageと比較してApple純正という点で長期的な保守性が高く今後のスタンダードになるではないかと考えられます。
今回は2019年に個人で制作したアプリでCocoaPodsを使っているために発生したビルドエラーに悩まされたことがSPMに移行するきっかけになりました。その上で、使用ライブラリが全てSPMに対応しておりどうしてもCocoaPodsを使わなければいけない理由が無かったため移行するに至りました。
移行したライブラリはFirebaseとFirebaseUIで、Xcode上のGUIからSPMを使用しました。
移行前に気をつけること
- Podfileを消す前に何のライブラリを使っていたのかメモしておきます。
- CocoaPodsを使っているままのファイルも残しておくと、後から元々使っていたライブラリのバージョンを確認するのに役立ちました。
移行時に困ったこと
1. FirebaseUI-iOS導入時にUp to Next Major Version
のバージョン上限が1.0.0から変わらない
Dependency RuleではVersion
Branch
Commit
のいずれかを選択し、ライブラリのバージョンを設定します。ここでは指定したメジャーバージョン未満で最も新しいバージョンに更新することができ、デフォルトでも選択されているVersion
のUp to Next Major Version
が適切です。メジャーバージョンの更新では更新時にコード変更が発生することがあるため、メジャーバージョン未満で設定することが安全なようです。
しかし、Up to Next Major Version
を選択した状態で最小バージョンを変更しても本来変更されるはずの最大バージョンの値が変わらないという問題が起きました。
解決した方法
- Dependency Ruleを
Version
のRange of Versions
もしくはExact Version
にし、最新バージョンの13.0.0(2023年9月現在)に値を変更してAdd Packageします。
※CocoaPodsを使っているファイルのディレクトリでターミナルからpod outdated
を実行することでライブラリのバージョンと最新バージョンを確認することができます。 - PROJECT -> PackageDependenciesよりSPMから導入したライブラリを確認し、ダブルクリックして表示される設定から、
Up to Next Major Version
に変更します。この時、すでに導入されたライブラリのバージョンが13.0.0であることから上限も13.0.0になった状態に変化していることが分かります。下限を12.0.0に設定しました。
🎉解決🎉
背景に、先に導入したFirebaseのバージョンに対してFirebaseUIのバージョンが低すぎるためにconflictが起きAdd Packageに失敗するということがありました。
特に問題なければ最新バージョンを利用するのが適切かと思います。
2.ビルドするとModule 'FirebaseStorage' not found
エラーが発生する
No such Module~~のエラーの類だと思い
- Clean Build Holder
- DerivedDataの削除
- シュミレータに既に入っているアプリの削除
- Xcodeの再起動
- FirebaseとFirebaseUIが互いに対応しているバージョンの確認
- Swift Package Managerのキャッシュ削除
などのあらゆる方法を試しましたが治りませんでした。
調べてみると、こちらのissueで解決方法が提示されておりました。
解決した方法
TARGETS -> Build Settings -> Swift Compiler - Custom Flags -> Other Swift Flagsに-Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/FirebaseStorage.modulemap
を追加します。
DebugとReleaseどちらにも記述したところ解決しました。
🎉解決🎉
移行後に気をつけること
- Crashlyticsを使用する場合、設定するRun ScriptがCocoaPodsとは異なるため変更する必要があります。Firebaseドキュメント - Firebase Crashlytics を使ってみるのステップ2に記載されている手順に従って変更します。
- GitHubを使っている場合、.gitignoreのCocoaPodsに関する記述をSwift Package Managerに置き換えます。.gitignoreファイルの中身は、gitignore.ioから簡単に生成することができます。
おわりに
CocoaPodsからSPMに移行したことで、ビルド時間が短縮された気がします。よかったです。
お読みいただき、ありがとうございました。
お役に立てましたら幸いです。
参考