iOS アプリ開発でサードパーティライブラリを導入する場合、CocoaPods か Carthage かのどちらかを使うのが定番です。
CocoaPods は、ライブラリのソースコードをワークスペースに組み込んで Xcode でビルドを行う仕組みです。このため、アプリのビルド時にライブラリのビルドが始まってしまうことがあります。これにより、ビルド時間が増加するため、開発効率が落ちるという問題があります。この問題は、先にライブラリをビルドしてバイナリを使う Carthage に比べて、CocoaPods が劣る点のひとつです。
しかし実は、CocoaPods でもビルド済みバイナリを使うことが可能です。以下、その方法を述べます。
cocoapods-binary プラグイン
cocoapods-binary プラグインは、先にライブラリをビルドして Xcode でビルド済みバイナリを使うようにする、CocoaPods のプラグインです。サードパーティ製のプラグインですが、CocoaPods のドキュメントで紹介されています(Pre-compiling dependencies)。
pod install
のとき、cocoapods-binary はライブラリのソースコードをダウンロードしてビルドします。そして、ビルドしたバイナリをワークスペースに組み込みます。したがって、Xcode はビルド済みバイナリを使います。
これにより、ビルド時間を短縮でき、開発効率が上がります。
プラグインの使い方
cocoapods-binary は RubyGems で提供されています。CocoaPods と同様に gem install
や bundle install
でインストールします。
次に、Podfile
の先頭に以下を追加します。
plugin 'cocoapods-binary'
そして、どの pod でバイナリを使うか指定します。
pod "ExpectoPatronum", :binary => true
または、次のように書けば全ての pod でバイナリを使います。
all_binary!
この場合、バイナリを使いたくない pod を :binary => false
で指定することもできます。
注意事項
このプラグインを使う場合、use_frameworks!
指定が必要になります。この指定は Dynamic framework を使う指定です。
現在の Xcode や CocoaPods は Static framework に対応しており、Static を使うほうが Dynamic に比べて起動時間が早いなどのメリットがありますが、このプラグインとの併用はできないようです。
バイナリ指定すると何が起こるか
pod install
を行うと、バイナリ指定していない場合は、Pods
ディレクトリに各ライブラリのソースコードが配置されます。一方、バイナリ指定した場合は、 Pods
ディレクトリに各ライブラリのバイナリが配置されます。
より正確には、Pods/_Prebuild
ディレクトリ以下に各ライブラリのバイナリが配置され、各ライブラリのディレクトリ Pods/ExpectoPatronum
には _Prebuild
へのシンボリックリンクが作成されます。
オプション
バイナリ指定すると、Pods
ディレクトリにはバイナリのみが置かれ、ソースコードは置かれなくなります。ただ、それは pod install
の際に毎回ソースコードをダウンロードしてくるということでもあります。pod install
の時間を短縮したい場合は、keep_source_code_for_prebuilt_frameworks!
を指定すれば、ソースコードも置いておくようにできます。
また、bitcode が必要な場合は enable_bitcode_for_prebuilt_frameworks!
を指定します。
まとめ
CocoaPods でビルド済みバイナリを使う方法を紹介しました。CocoaPods でビルドを早くしたい方は一度試してみると良いと思います。
なお、詳細は cocoapods-binary のページを参照してください。