流行のCocoaPods使ってみて、エラーになってはまった話(修正)
CocoaPodsを導入すると、iOS開発で使用するライブラリの導入管理が簡単になるとしって使ってみたんですが、いくつかはまったところがありました。
環境
環境はこんな感じ
最初にはまったところ
- 複数ターゲットでCocoaPodsで導入したライブラリを使用する場合、pod installをする前に必要なプロジェクトターゲットを作成する必要がある
- Header Search Pathが違う!! 一部のライブラリのヘッダファイルがHeadersディレクトリにシンボリックリンクされない!!
- テスト用static-libraryを作っても、デフォルト以外は自動でリンクはしてくれない
下のように、ターゲットが2つあるとして(アプリ用とテスト用)
後からターゲットを作成してしまうと、CocoaPodsでstatic-libraryがリンクされません。なので複数のターゲットを自動管理する場合は、pod installする前に必要なターゲットは作成しておくといいです。
2. Header Search Pathが違う!! 一部のライブラリのヘッダファイルがHeadersディレクトリにシンボリックリンクされない!!
*よく見たらHeadersディレクトリはありました!! なぜか全部のライブラリがコピーされない
> :exclusive => trueでほかのtargetで指定したライブラリのシンボリックリンクが作られないのは、バグっぽいので修正してpull request送りました。(2012/01/09)
> 上の暫定対策版をインストールできるようにしましたので、よろしければ、 CocoaPods 0.3.9 修正非公式版インストール — Gist からインストールしてみてください
3.のPodfileの記述に関係あるんですが、どうも targetブロックで:exclusive => trueを使ってしまうとtargetブロックの外で宣言しているライブラリのヘッダファイルがHeadersディレクトリにコピーされないみたいです。
- targetブロックで:exclusive => trueを使った場合は、targetブロックの外のライブラリのヘッダファイルがコピーされない
platform :ios dependency 'JSONKit', '~> 1.4' dependency 'AFNetworking', '~> 0.7' dependency 'BlocksKit', '~> 1.0' dependency 'NSLogger' # Testing framework for Test target. target :test, :exclusive => true do dependency 'LRMocky' end
- targetブロックで:exclude => trueを使わなければ全部コピーされる
platform :ios dependency 'JSONKit', '~> 1.4' dependency 'AFNetworking', '~> 0.7' dependency 'BlocksKit', '~> 1.0' dependency 'NSLogger' # Testing framework for Test target. target :test do dependency 'LRMocky' end
ということで、今のところtest用に追加のライブラリだけをパッケージングするのは難しそうです。
3. テスト用static-libraryを作っても、デフォルト以外は自動でリンクはしてくれない
下記のように、Podfileを記述したとしてtargetブロックに囲まれた方のstatic-libraryは手動でリンクする必要があります。
最初、targetに指定する引数が、xcodeのプロジェクトターゲットと同じものだと思っていたのですが、全く関係ないらしいです。
よくある(:production, :develpment, :test)とおなじです。
CocoaPodsでは、下記の3つのシンボルが用意されています。(任意の文字列を使ってもいい)
- :default(targetブロックを使ってないところ)
- :debug
- :test
platform :ios dependency 'JSONKit', '~> 1.4' dependency 'AFNetworking', '~> 0.7' dependency 'BlocksKit', '~> 1.0' dependency 'NSLogger' # Testing framework for Test target. target :test, :exclusive => true do dependency 'OCMock' dependency 'LRMocky' end
この構成だと下記の2つのstatic-libraryのターゲットを持つプロジェクトが生成されます。
- libPods.a (デフォルト)
- libPods-test.a (target :testで作ったやつ、ファイル名に指定した引数がsuffixとして付与される)