XcodeGenプロジェクトのFirebaseライブラリーをSwift Package Manager経由で追加する
実行環境
- XcodeGen: 2.32.0
- Xcode 13.4.1
FirebaseをSwift Package Managerで追加したい
個人アプリで、Firebaseを利用しています。
プロジェクトの構成はXcodeGenで生成しており、FirebaseはCocoaPodsで追加させていました。
しかし、Firebase 8.0.0(2021年5月11日リリース)からSwift Package Manager(以下SPMと略します)経由で追加できるようになりました。
私のプロジェクトではFirebaseのインストールがCocoaPodsの唯一の利用目的だったので、SPMに置き換えればCocoaPodsをやめれると考えました。
いろいろ調べて、XcodeGenのproject.ymlの書き方がある程度わかったのでブログに残したいと思います。
利用しているFirebaseのプロダクト
私が利用しているFirebaseのプロダクトは次の2つです。
- FirebaseCrashlytics
- FirebaseAnalytics
この2つをSPMで追加します。
project.yml
project.yml全体像はこちらです。
必要な項目のみを抜粋しています。
settingGroups:
shared:
base:
OTHER_LDFLAGS:
- $(inherited)
- -ObjC
packages:
Firebase:
url: https://github.com/firebase/firebase-ios-sdk
from: 8.0.0
targets:
YOUR_APP_NAME:
settings:
groups: [shared]
dependencies:
- package: Firebase
product: FirebaseCrashlytics
- package: Firebase
product: FirebaseAnalytics
postBuildScripts:
- script: ${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
name: Crashlytics run
inputFiles:
- ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}
- $(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
各項目ごとに解説していきます。
SPMでFirebaseを組み込む
packages
keyでSPMの組み込みができます。
packages:
Firebase:
url: https://github.com/firebase/firebase-ios-sdk
from: 8.0.0
プロジェクトにFirebaseのプロダクトを追加する
dependencies
keyでプロジェクトにFirebaseのプロダクトを追加します。
// project.yml
dependencies:
- package: Firebase
product: FirebaseCrashlytics
- package: Firebase
product: FirebaseAnalytics
package
に「SPMでFirebaseを組み込む」で指定した名前とproduct
にはFirebaseが指定している値を入力します。
https://github.com/firebase/firebase-ios-sdk/blob/master/Package.swift
上記のファイルの.library
の名前にある文字列を指定します。
FirebaseAnalytics
ならこのように指定されていました。
// Package.swift
products: [
.library(
name: "FirebaseAnalytics",
targets: ["FirebaseAnalyticsTarget"]
),
project.yml
に戻ります。
複数のプロダクトを指定する場合は、XcodeGenでは一つずつpackage
直下にproduct
を指定するようです。
私は最初package
に複数のproduct
を紐付けて書いていて時間を1時間ほど溶かしたので、みなさんもぜひ気をつけてください。
// ○
- package: Firebase
product: FirebaseCrashlytics
- package: Firebase
product: FirebaseAnalytics
// ☓
- package: Firebase
product: FirebaseCrashlytics
product: FirebaseAnalytics
FirebaseAnalytics特有の指定
FirebaseAnalytics
には-ObjC
のリンカーオプションが必要です。
XcodeGenで指定するには以下をymlに記述します。
OTHER_LDFLAGS:
- $(inherited)
- -ObjC
FirebaseCrashlytics特有の指定
FirebaseCrashlytics
を利用するにはdSYMファイルをアップロードする設定が必要です。
XcodeGenではpostBuildScripts
keyで以下を指定するとアップロードされるようになります。
postBuildScripts:
- script: ${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
name: Crashlytics run
inputFiles:
- ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}
- $(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
おわりに
XcodeGenでFirebaseをSPM経由で追加する方法を解説しました。
これでCocoaPodsをやめることができてプロジェクト構成をXcodeGen一本に絞れました。
嬉しい。
参考
- https://twitter.com/d_date/status/1298879425094672389
- d_dateさんのFirebaseのyml指定のつぶやき。
- わかりやすい
- https://github.com/covid19cz/erouska-ios/blob/develop/project.yml
- FirebaseをSPMで追加するサンプル
- productはpackageを一つずつ対にしないといけないとこれで気づきました
宣伝
AmazonとBOOTHにて「Swift Concurrency入門」発売中です。
AmazonはインプレスR&D社より発売しました商業誌版で、BOOTHは同人誌版です。
組版は異なりますが、内容は変わりません。
Swift Concurrencyを網羅的に学べ、さらに既存アプリへの適応方法も解説しています。
日本語で体系的に学べる解説本は他になかなかありません。
ぜひチェックしてください!