Capacitor iOSでSwift Package Managerを採用する方法
Capacitor iOSでは、リリース以降、CocoaPodsを公式サポートしておりました。
CocoaPodsは多くのiOSプロジェクトで採用されており、豊富なライブラリが利用可能な点や、柔軟な設定が可能であることが魅力です。
しかし、2021年にAppleがSwift Package Manager(SPM)を発表しました。CocoaPodsと異なり、Xcodeデフォルトであることや、必要な依存関係だけをビルドすることでビルド時間が短縮できることに注目が集まっており(まぁ、何せApple公式ですから)、多くのパッケージがSPMへの対応を進めています。
それを背景に、Capacitorもv6からSPMへの対応を進めています(現在、Experimental)。
SPMを新規プロジェクトで
% npx cap add ios --packagemanager SPM
packagemanager引数を渡すだけです。簡単ですよね。
CocoaPods構成からどのように変わったか
Podfile
が削除され、 CapApp-SPM
フォルダが作成されました。これは名前は決め打ちですね。CLIをみてみると、Packageファイルを探すのに固定名称を使っています。
中身は以下の通りです。
- ios/App/CapApp-SPM/Sources/CapApp-SPM/CapApp-SPM.swift
- ios/App/CapApp-SPM/Package.swift
- ios/App/CapApp-SPM/README.md
ionic-team/capacitor
内にあるので、直接みてみるとわかりやすいかと思います。
CapApp-SPM.swift
の中身は public let isCapacitorApp = true
だけですね。 isCapacitorApp
変数を使ってる場所を探したのですが見つからなかったので、今後の布石でしょうか。あるとしたら、CocoaPodsで使えた pre_install
や installer_representation
に近い実装を入れることができるファイルになるのかもしれません。
Package.swift
は、SPMのパッケージ管理ファイルですね。CocoaPodsの時相応に npx cap update ios
を行うと、 package.json
をみて、Capacitorプラグインを探し出してここに自動的に記載してくれます。Podfileのように、手動で追加することはできないですね。全部自動的に書き換えが走ります。
pod updateを行う必要がなくなった
今回の一番のメリットは、 pod update
を行う必要がなくなったことでしょう。以前は採用しているプラグインが依存しているPodライブラリのバージョンをあげると、 npx cap update ios
でエラーが走りました。これに対処するには ios/App
フォルダに移動して pod update
を行う必要があり(エラー文でちゃんと案内は走るものの)初心者にはハードルが高く、また慣れていても手間でした。Swift Package Managerに移行するとこういったことはなく自動的に依存関係を更新してくれるのは大きなメリットでしょう。
プロジェクト途中での移行方法は?
ドキュメントに「今後整備します」とされています。
軽くみたところ、 ios
フォルダをさわっての移行は現実的ではないようです。というのも、CocoaPodsとの同居はCLIが対応していません。まぁ、package.jsonから自動的にCapacitorプラグインを反映する機構を考えると、両方あるのは現実的ではありませんよね。既存アプリで移行したい場合は、一度 ios
フォルダを削除した上で、 cap add ios --packagemanager SPM
を実行しましょう。これが一番プロジェクトがクリーンに保てて、現実的な方法です。
いつSPMに移行するか
Capacitor公式プラグインはすべてSPMに移行済みですが、Capacitor Communityプラグインを含めてサードパーティプラグインはほとんどSPMへの対応を進めていません。また、SPM対応自体がExperimentalなので、安定版のリリースを待つのが良いでしょう。現在、Capacitor 7.0.0がalpha版なのではやくてもCapacitor 7が安定してから、ざっくり来年の夏ぐらいに対応できたら早期対応になるぐらいのスケジュール感でみてみるといいかと思います。
それではまた。
Discussion