React NativeのSwift Package Manager対応の展望
CocoaPodsのアナウンスを受けて、React Nativeが今後どうなるのか不安な方がいそうだなーと思ったので、僕が調べた範囲でこんな状況かなと思っていることを書いてみます。原典は貼っておくので、基本的には僕のことは信じずに元記事を読んでください。
CocoaPodsのメンテナンスモード
古くからのiOS/macOS開発者にとっては馴染み深いパッケージマネージャーであるCocoaPodsですが、この度、開発体制がメンテナンスモードに入ることが発表されました。
これは急な話ではなく、2017年に公式のパッケージマネージャーツールであるSwift Package Managerが登場してから、いつか来る未来として予想されていたことです。ここ数年、Swiftで新規のiOS/macOSアプリケーションを開発する際には、Swift Package Managerを初めから採用していた現場も多くなってきていたことでしょう。
順当に行けば、開発者がだんだんとCocoaPodsを使わなくなり、ほとんど使われなくなった段階で開発終了、といった流れが想像されるのですが、前述の記事を見ていると、そうはならなかったようです。大人気のフレームワークであるReact NativeやFlutterがネイティブモジュール部分の依存性解決にCocoaPodsを使っていたため、むしろCocoaPodsのトラフィックは増加傾向だったのだとか。この辺のアンバランスさもあって、CocoaPodsのメンテナンスモード宣言が行われたのかもしれません。
FlutterのSwift Package Manager対応
FlutterではすでにSwift Package Manager対応が進んでおり、実際に使うこともできるようです。
えらい。
React NativeのSwift Package Manager対応
さて、我らがReact Nativeはどうでしょうか。今のところ公式ドキュメントにはそれらしい記述はなさそうです。
ですが、何も進んでいないわけでもありません。昨年の初めから、Swift Package Manager対応がGitHubのIssueで議論されていました。
昨年の時点では、実現性に難があるようでしたが、今年になってからSwift Package Manager側の改善もあり、実現性が高まってきているようです。
とはいえ、CocoaPodsはReact Nativeのエコシステムに深く食い込んでいます。すぐにまるっと取り替えることはできません。そこで、過渡期の実装を支えてくれそうな、CocoaPodsとSwift Package Managerの間を取るアプローチが提案されました。
CocoaPodsのクライアント側で使う .podspec
ファイルに、Swift Package Managerの依存関係を記述できるようにするというものです。
if defined?(:spm_dependency)
spm_dependency(s,
url: 'https://github.com/apple/swift-atomics.git',
requirement: {kind: 'upToNextMajorVersion', minimumVersion: '1.1.0'},
products: ['Atomics']
)
else
raise "Please upgrade React Native to >=0.75.0 to use SPM dependencies."
end
これにより、コマンドライン上は pod install
を実行するものの、ライブラリ本体はSwift Package Managerで管理されているものを取得できるようになるようです。
この変更は、すでに先月(2024年7月)中にはv0.75-rc.6としてリリースされており、次の正式アップデートであるv0.75には含まれるはずです。このアップデートを受けて、React NativeのプロジェクトがSwift Package Managerに対応する準備を進めることができるようになるでしょう。
とはいえ、これはワークアラウンドです。抜本的な改善についても取り組む意志はあるようですが、もしかすると着手は来年になるかも、とのこと。
まとめ
React Native v0.75やExpo 52がリリースされたら、ネイティブモジュール[1]にSwift Package Manager由来のライブラリが取り込まれ始めることと思います。不安定になるライブラリもちらほら出てくるかと思いますので、メンテナンスしている皆さんは覚悟を決めておきましょう。
-
多くの場合は
expo-xxxxx
のことです ↩︎
Discussion