CocoaPods
とは
Swift/Obj-C のための依存管理ツール。Podfile というテキストファイルに全てのライブラリの依存を記述する。CocoaPods はライブラリ間の依存関係を解決し、最終的にソースコードを取得し、それを Xcode の workspace にリンクして、プロジェクトをビルドしてくれる。
概念
pod
podspec
使い方
インストール
code:shell
$ sudo gem install cocoapods
Podfile
基本的には、Podfile を作成してそこに依存を記述していけば良い。pod init で雛形を作成することもできる。適当な Xcode プロジェクトを作って pod init すると以下のようなかんじ。
code:bash
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'project name' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for amplify sample
end
pod install vs pod update
pod install はプロジェクト立ち上げ時の初回のみで pod update はその後利用する、と思われているが、常にそうとは限らない
pod install は、プロジェクトに 新しい pods をインストールする のに利用する。これは、たとえ既に Podfile があり pod install を実行済みでも 実施される
pod update [PODNAME] は、pods を新しいバージョンに更新する のに利用する
pod install
pod install 実行時には毎回、インストールした各 pods のバージョンが Podfile.lock ファイルに記述される
pod install 実行時には Podfile.lock にまだリストされていない pods の依存のみを解決する
Podfile.lock に記述がない場合、Podfile の記述にマッチしたバージョンを検索しインストールする
Podfile.lock に記述がある場合、Podfile.lock の記述にマッチしたバージョンをインストールし、新しいバージョンを検索することはない
pod outdated
Podfile.lock に記述された pods の中から、新しいバージョンを持つ pods を列挙する
pod update PODNAME を各々に実行すれば更新できる (Podfile 内のバージョン指定の範囲には従う)
pod update
pod update PODNAME を実行すると、PODNAME pod の更新されたバージョンを探索する。この時、Podfile.lock は気にしない
可能であれば pod を最新バージョンに更新する (Podfile 内のバージョン指定の範囲には従う)
PODNAME を指定しなかった場合には全ての pod を更新する
望ましい使い方
pod の更新がしたいなら pod update、新しい pod を追加したなら pod install
Podfile.lock のコミット
Pods フォルダーをコミットしないポリシーであるのなら、Podfile.lock ファイルは常に commit & push するべき。さもなくば、ロジックが壊れてしまう可能性がある。
Podfile に厳密にバージョン指定を記述しておけば十分ではないか?という話もあるが、それだけでは厳密にはチームメンバーの間で 全ての pod のバージョンを揃える ことはできない。
なぜならば、ある Pod A が別の Pod A2 に依存していた場合。Pod A のバージョンを 1.0.0 に固定しておいても、メンバーが pod install を走らせるタイミングによっては、Pod A2 のバージョンは変動してしまう恐れがある。そのため、全ての Pod のバージョンを揃えるためには、Podfile.lock を共有するしかない。
Pods ディレクトリを Git 管理するか?
公式では .gitignore に含めず管理することを推奨している。
Pods ディレクトリを Git 管理するメリット
CocoaPods をインストールしなくても clone してすぐにビルド & 実行できる
Pod の大元 (GitHub 等) がダウンしていても常に Pod 自体を利用できる
Pod 自体について、それを最初にインストールした時と現在との間の同一性が保証される
Pods ディレクトリを Git 管理しないメリット
リポジトリのサイズが小さくなる
大元 (GitHub 等) が生きていれば、CocoaPods により他メンバーと同様のインストールが可能
コンフリクトに悩まされることがない
Podfile.lock とは?
pod install の初回実行時に生成され、インストールされた Pod のバージョンを追従する
裏で何が起こっているか?
公式を見ると書いてある
トラブルシューティング
pod repo update
pod コマンドでは、ローカルにライブラリのメタ情報をキャッシュしている。そこにバージョン情報がなければ、インストールできない。そのため、キャッシュを更新してやる必要がある、っぽい。
code:bash
None of your spec sources contain a spec satisfying the dependencies: XXX.
You have either:
* out-of-date source repos which you can update with pod repo update or with pod install --repo-update.
* mistyped the name or version.
* not added the source repo that hosts the Podspec to your Podfile.
Note: as of CocoaPods 1.0, pod repo update does not happen on pod install by default.