背景
タイトルの通りですが、業務でやったことのないiOSアプリ開発の仕事が急に来た。
直近の課題の1つにパッケージマネージャ何使えばいいんだ問題があったのでわからないなりに調べてみた結果と所感をまとめた個人の備忘録です。
間違ってたら優しく指摘ください!(個人ブログも参考にしたので情報古いところあるかも)
候補
- CocoaPods
- Carthage
- Swift Package Manager
CocoaPods
特徴
- 中央集権的なパッケージマネージャ
- Specsと呼ばれる巨大なリポジトリの中に全てのパッケージ情報を詰め込んでいる(ので中央集権的)
- podコマンドによりパッケージの登録・更新が可能
- OSSで開発されている。Ruby製(なのでgemでMacへインストールする)
- 公式ページの検索が非常に優秀でライブラリを探しやすいとのこと
メリット
- Webサイトでライブラリを探せる
- Dynamic FrameworksとStatic Librariesの両方に対応(Dynamic Frameworkはアプリ起動時に結合されるもの、Static Frameworkはアプリビルド時に結合されるものらしい)
- 依存するライブラリがさらに依存しているライブラリも解決してくれる
- 依存関係の定義ファイルを見ればどのライブラリにアプリが依存しているか一目でわかる
- 依存ライブラリのアップデートをコマンド1つで検知できる
- pod tryでライブラリのリポジトリ中のサンプルプログラムをすぐに試せる
- 公式で簡単に依存関係を管理できるアプリを出している
- ほぼすべてのライブラリがCocoaPodsをサポートしている
デメリット
- CocoaPodsを入れてから初めて依存関係をインストールとき、長時間待つ必要がある。それは前述の巨大なリポジトリをすべてMacに入れるため。また、pod updateするときも同じだけ待つ必要がある
- 依存ライブラリが使えるようにするために、CocoaPodsは勝手にプロジェクトをいじる。それによって問題が起きてしまう場合が多い
- プロジェクトをビルドするとき全ての依存ライブラリをビルドするのでビルド時間が長い
Carthage
特徴
- 非中央集権的パッケージマネージャ
- CocoaPodsとは違いパッケージが1リポジトリで管理されていなく、別々のリポジトリで個別に管理
- 依存に追加したいgithubのリポジトリを指定してパッケージをインストールする
- Swift製のOSS
メリット
- Dynamic FrameworksとStatic Librariesの両方に対応
- 依存するライブラリがさらに依存しているライブラリも解決してくれる
- 依存関係の定義ファイルを見ればどのライブラリにアプリが依存しているか一目でわかる
- 依存ライブラリのアップデートをコマンド1つで検知できる
- 1度しかライブラリのビルドをしないのでCocoaPodsに比べてビルド時間が速い
- CocoaPodsのように勝手にプロジェクトがいじられることがないので安心
デメリット
- 依存関係を追加するためのステップが多いのでミスしがち
- すべてのライブラリがCarthageをサポートしているわけではない
Swift Package Manager
特徴
- Apple公式で出したパッケージマネージャ
- 対応しているライブラリが少なく、バックエンド用途のライブラリが多いらしい
メリット
- 今後スタンダードになっていくであろうパッケージマネージャらしい
- 依存するライブラリがさらに依存しているライブラリも解決してくれる
- 依存関係の定義ファイルを見ればどのライブラリにアプリが依存しているか一目でわかる
デメリット
- watchOS、tvOSなどサポートしていないOSがある
- 決まったフォルダ構成に従うことを強制される
- 対応するライブラリがまだ少ない
所感
対応しているライブラリがまだまだ少なそうな「Swift Package Manager」は現時点で避けたい。
依存関係の追加が楽だが勝手にプロジェクトをいじられて大変な思いをしそうなCocoaPodsをとるか、やや追加が面倒かつ対応してないライブラリもあるがプロジェクトをいじられない心理的安全性を保てるCarthageをとるかでいうと、個人的にはCarthageに軍配。
ただでさえ初めてのネイティブ開発で依存関係追加の手間を惜しんで、CocoaPodsが何かを壊してXcodeとにらめっこ...は避けたいため。(ある程度形ができたら引き継ぐ予定のメンバーもネイティブ知らない人ばかりなので...)