💭

Capacitor iOSでSwift Package Managerを採用する方法

2024/11/27に公開

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ファイルを探すのに固定名称を使っています。

https://github.com/ionic-team/capacitor/blob/main/cli/src/util/spm.ts#L23

中身は以下の通りです。

  • 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 内にあるので、直接みてみるとわかりやすいかと思います。

https://github.com/ionic-team/capacitor/tree/main/ios-spm-template/App

CapApp-SPM.swift の中身は public let isCapacitorApp = true だけですね。 isCapacitorApp 変数を使ってる場所を探したのですが見つからなかったので、今後の布石でしょうか。あるとしたら、CocoaPodsで使えた pre_installinstaller_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