Xcode13.3 + Carthageでビルド形式をframeworkからXCFrameworksに移行しました。
ポイント
- carthageのビルドオプションに--no-use-binariesを指定
- XCframework形式でバイナリ配布していないライブラリがあるため
- General - Frameworks, Libraries, and Embedded Contentで、carthageで管理してるライブラリのEmbedを「Do Not Embed」から「Embed & Sign」に変更
Xcode12以降、Carthageでビルドが通らなくなり、以下のいずれかの対応が必要でした。
- XCFrameworkに移行する
- こちらの回避策のシェルでビルドする
XCode12の時はxcframeworkへの移行が一筋縄では行かなかったことがあり、回避策のシェルを使う形で対応していましたが、Xcode13へのアップデートで回避策を適用してもビルドエラーが発生するようになり*1、この機会にXCframeworkへの移行に再トライしました。
*1 現在はこちらのPRでXcode13向けの対応がされています
一応公式のREADMEでframework形式からXCFrameworks形式への移行手順の記載があるのですが、自分の環境では追加で対応が必要でした。
- Carthage/Buildフォルダの削除
- --xc-frameworksオプションを追加してビルド
- Build Phaseからcarthage copy-frameworksの削除
- General settingsのFrameworks, Libraries, and Embeddedで、frameworkを削除し、ビルドしたXCFrameworksを追加
carthageのビルドオプションに--no-use-binariesを指定
carthageはライブラリ提供元でバイナリが配布されている場合、ビルドが不要になることがメリットなのですが、framework形式のみで配布しているライブラリも沢山あります。
この場合、--xc-frameworksオプションを指定してもビルドが実行されず、XCFrameworkが生成されません。
--xc-frameworksと合わせて、--no-use-binariesを指定してバイナリは使用せずソースからビルドすることで、確実にXCFrameworkが生成されます。
carthage update --platform ios --use-xcframeworks —no-binaries
Embedded Contentを「Do Not Embed」から「Embed & Sign」に変更
General - Frameworks, Libraries, and Embedded Contentで、framework形式の場合は、Do Not Embedを選択していました。
Do Not EmbedのままXCFrameworkを指定するとビルドは通るのですが、起動するとライブラリが見つからずクラッシュします。
Library not loaded: @rpath/Apollo.framework/Apollo
実際にシミュレーターのディレクトリを見るとCarthageでビルドしたライブラリが含まれていない状態です。
XCFrameworkの場合は、Embed & Signに変更することで、ライブラリがバンドルされ、クラッシュしないようになりました。
公式READMEのQuick Startには、XCFrameworkの場合はEmbed & Signを選ぶよう記載があるのですが、移行手順だけ見ていると見逃してしまいます。
XCFrameworkに移行できたので、M1 Macにも移行できる見通しが立ちました。