🎉

iOSプロジェクトにおけるCocoaPodsとCarthageについて

2021/01/16に公開

概要

開発をする上で、使用するパッケージの依存関係をコントロールするためにパッケージマネージャーが必要です。

他の言語やフレームワークの代表的なものでいうならばNode.JSにおけるnpm、RubyにおけるRubyGemsなどがあります。

そんな中、iOSプロジェクトでは主にCocoaPodsとCarthageの二つの選択肢があります。

それらのメリットやデメリットが気になったので調べてみました。

CocoaPods

Cocoapodsは古いObjective-Cの時代から存在し、現在のSwiftでも動作します。

既存の多くのiOSプロジェクトでは、恐らくかなりの割合で依存関係の管理に使われていることでしょう。CocoaPodsはRubyライブラリとして提供されており、RubyGemを使ってインストールする必要があります。
CocoaPodsはRubyでビルドされているため、OS Xの場合、OS Xで利用可能なデフォルトのRubyでインストール可能です。ターミナルで以下のコマンドを叩くとインストールされます。

$ sudo gem install cocoapods

CocoaPodsではpod initコマンドで初期化、テンプレートのPodfileを作成します。

例えば、Podfileが以下の内容だった際に

platform :ios, '8.0'
use_frameworks!

target 'MyApp' do
  pod 'AFNetworking', '~> 2.6'
  pod 'ORStackView', '~> 3.0'
  pod 'SwiftyJSON', '~> 2.3'
end
$ pod install

以上のコマンドを実行することで記述している依存関係をプロジェクトにインストールできます。

使用するメリット

  • 設定が簡単
  • 依存関係を対象にリンクさせ、ビルドの全プロセスを自動化できる
  • コミュニティが大きい
  • コードの少ない小規模なプロジェクトでも、手っ取り早く動作させることができる

使用するデメリット

  • 他のプログラミング言語(CocoaPodsが作られているRubyなど)の知識が必要な点
  • すでにXcodeワークスペースを使っている場合、統合するのが難しい点
  • 一度統合した後に削除することが難しい点
  • CocoaPodsはXcodeのプロジェクト全体をコントロールしているので、何か失敗するとプロジェクト全体のビルドが停止しまいます。CocoaPodsによって投げられたエラーを修正するにはiOSプロジェクトの内部でCocoaPodsが何を変更したのかを理解する必要があります。
  • CocoaPodsはプロジェクトを特定の構造に変化させてしまいます。例えば、CocoaPodsがXcodeのプロジェクトとファイルを更新するのは、何が変更されたかを理解しなくても良く、ブラックボックス的に動作します。
  • iOSアプリのビルドが、時間のかかるプロセスになる。
  • CocoaPodsをサポートするライブラリやフレームワークをビルドするのは、Rubyに関しての知識がない場合、あまり簡単なものではない点。開発者は.podspecファイルを書区必要があり、プロジェクトには直接的に関わらないRubyの規約に従わなければならないという点があります。

Carthage

Carthageは、もう一つのシンプルな依存関係管理ツールです。Carthageは、Xcodeプロジェクト内で何も変更せずにiOSの依存関係を管理するために、純粋にSwiftで書かれています(リンク先のGithubをご覧いただければ実際にSwiftで書かれているということが分かるでしょう)。
なぜCarthageが作成されたのか知りたい場合は、経緯をここで読むことができます。

CarthageはXcodebuildツールを使って依存関係をダウンロードしてビルドするだけで、CocoaPodsのようにプロジェクトファイルやXcodeプロジェクトのビルド設定を変更することはありません。ターゲットのビルドフェーズ内のLinked Frameworks and Librariesにフレームワークのバイナリを手動でドラッグしなければなりません。

Carthageをインストールするには以下のようにHomeBrewを使うか、Githubから.pkgをダウンロードして手動でインストールします。

$ brew install carthage

これでCarthageを使えるようになりました。上記のように、Carthageを使ってSwiftyJSONを取得する必要があります。ひとまず、プロジェクトに移動し、Cartfileを作成し、以下のような内容を記述してください。

$ touch Cartfile
github "SwiftyJSON/SwiftyJSON"

Cartfileを保存したのち、以下のコマンドを実行すると依存関係が取得されます。

$ carthage update

これでCarthage/Checkoutsフォルダに依存関係を取得し、それぞれをビルドします。ここで、CocoaPods はすべて自動的に動作しますが、手動で行う必要があります。

CarthageはXcodeの設定やProjectファイルには直接的に影響を与えません。Carthageは非常にシンプルで、依存関係をチェックアウトしてビルドするだけで、Xcodeへのバイナリの追加は任意です。つまり、Xcodeに追加する依存関係を操作できます。

仮に一度導入しても、iOSプロジェクトからCarthageを削除するのは非常に簡単です。
XcodeプロジェクトからCarthageを完全に削除するためにできる手順はいくつかあります。

  • CartfileとCartfile.resolvedを削除する
  • Carthageディレクトリを削除
  • リンクされているフレームワークをターゲットのビルドフェーズから削除する。
    などなど。
    これでCarthageを使用しなくなります。簡単ですね。

使用するメリット

  • CarthageはiOS向けの分散化されたシンプルに依存関係を管理出来る。
  • Carthageは純粋にSwiftで書かれているため、安定して動作するという点。また、開発者がCarthageの裏側にある技術を理解し、CarthageKitを使って別のツールを書くことができる。
  • Carthageは統合が簡単で、プロジェクトのニーズに合わない場合はプロジェクトから簡単に削除することができる。
  • 先述したとおり、Xcodeの設定やプロジェクトファイルには触れません。依存関係の適切な制御を行うことが可能である。
  • Carthageを使うと、libのビルドや更新が簡単になる。
  • CI/CDサービスとの連携が比較的簡単にできる。

使用するデメリット

  • セットアップ中に実行しなければならない手動のステップが多い。
  • まだ新しいため、CocoaPodsのように大きなコミュニティではない点。
  • 動的なフレームワークでしか動作せず、静的なライブラリでは動作しない。
  • Objective-Cのバックグラウンドを持つ従来のiOS開発者は、新しい技術であるCarthageを使うことに消極的で、CocoaPodsを使いたがる可能性がある。
  • フレームワークのビルド中にCarthageの方が遅いという声もある。
  • homebrewでインストールした場合、Carthageは下位互換性がない。
  • すべてのフレームワークをCarthageで利用できるわけではない点。一部の古いライブラリはgitサブモジュールを使って追加する必要がある

まとめ

こんなところでしょうか。色々調べましたがやはり状況に応じて使い分ける方が良さそうです。使い慣れたものばかりを使うのも習熟度を深めるためには重要かもしれませんが、メリットデメリットを知ることで今後の選択の幅が広がりそうです。

Discussion