CocoaPods を使ってオープンソースのライブラリをプロジェクトで簡単に管理する : Objective-C プログラミング
PROGRAM
CocoaPods を使ってオープンソースのライブラリをプロジェクトで簡単に管理する
iOS/OS X アプリの制作で利用できるオープンソースのライブラリを活用したいと思ったのですけど、ソースコードをそのまま自分のプロジェクトに追加してしまうと、自分自身のソースコードのバージョン管理と分離するのが手間だったり、バージョンの維持管理が面倒になってしまいがちです。
オープンソースを採り入れるとき、どんな風に管理したら良いのだろうと考えたとき、そういえば CocoaPods という便利なツールがあると聞いたことがあったのを思い出し、いよいよそれを使ってみることにしました。
CocoaPods とは
CocoaPods が便利とまでは知っていたものの、どんな風に便利なのかわかっていなかったので調べてみました。
CocoaPods は、どのライブラリが必要かを Podfile に記載して "pod install" コマンドを実行すると、記載したライブラリが自動的にダウンロードされて、それがまとめられたプロジェクトファイルをひとつ生成してくれるツールのようです。ライブラリの更新も同じ操作で行えます。
プロジェクトは静的ライブラリとして生成されるので、後はこれを使いたいプロジェクトに組み込むだけで利用できます。プロジェクトへの組み込みも自動で行ってくれるので、とても簡単に利用できる印象です。
CocoaPods をインストールする
CocoaPods のインストールは、Mac のターミナルから実行します。
sudo gem install cocoapods
このコマンドを実行して管理者アカウントのパスワードを入力すると、しばらくしてターミナル上に実行ログがずらずらと表示され始めます。
そして数分ほどして CocoaPods のインストールが完了します。これだけで CocoaPods が利用できるようになりました。
プロジェクトで CocoaPods を利用する
Xcode のプロジェクトで CocoaPods を利用するに当たって、最初に少しだけ準備が必要になります。
Podfile を作成する
まず、プロジェクトのルートディレクトリに "Podfile" というテキストファイルを用意します。
Xcode から作成する場合は、左側のプロジェクトナビゲーターで「プロジェクト名」を選択して、Other カテゴリにある Empty ファイルを選択します。
そうすると、ファイル名などを指定する画面が表示されます。
ここで "Save As:" に "Podfile" と入力して、"Group" ではプロジェクト名が選択されていることを確認します。その下の "Targets" は、何もチェックが入っていない状態にします。
そうして「Create」ボタンをクリックすると、プロジェクトファイルと同じフォルダーに "Podfile" が出来上がります。
Podfile を編集する
Podfile には、CocoaPods から取り込みたいライブラリの情報を記載します。
platform :ios, ‘7.1’
pod ‘MMMarkdown’, ‘>= 0.3’
最初の "platform" では、どのような環境に対応したライブラリを使用するかを指定します。ここに ":ios" を指定すると iOS 用のライブラリを、":osx" を指定すると OS X 用のライブラリを使用することになります。続けてカンマで区切って、先ほど指定した OS のどのバージョンと互換性のあるライブラリを使用するかを指定できます。
続く "pod" では、取り込みたいライブラリ名を指定します。複数のライブラリを取り込みたい場合は、その数だけ "pod" を行を分けて記載します。
各ライブラリではカンマで区切って、使用するライブラリのバージョン情報を指定できます。ここではバージョン番号と併せて、次の記号を指定できるようになっているようです。
0.3 | バージョン 0.3 を使用します。 |
---|---|
> 0.3 | バージョン 0.3 より大きいものを使用します。 |
>= 0.3 | バージョン 0.3 以上のものを使用します。 |
< 0.3 | バージョン 0.3 より小さいものを使用します。 |
<= 0.3 | バージョン 0.3 以下のものを使用します。 |
~= 0.3 | バージョン 0.3 以上 1.0 未満のものを使用します。 |
~= 0.3.1 | バージョン 0.3.1 以上 0.4.0 未満のものを使用します。 |
ライブラリをインストールする
Podfile を記載したら、Podfile のあるディレクトリ上で、次のコマンドを実行します。
pod install
こうすることで、Podfile に記載したライブラリがインストールされ、それをまとめた Xcode プロジェクトファイルが作成されます。
このコマンドを OS X のターミナルで実行すれば良いのですが、せっかくなので Xcode から実行するようにしてみます。
そのために、アプリのプロジェクトに、"Other" カテゴリにある "Aggregate" ターゲットを追加します。
ターゲットにつける名称は "CocoaPods" でいいでしょう。作成先のプロジェクトは、先ほど Podfile を作成したアプリのプロジェクトにします。
そして、出来上がったターゲットの Build Phases に Run Script ビルドフェイズを追加して、スクリプトを記載します。
ここに記載するスクリプトは次の通りです。
export LC_ALL="en_US.UTF-8"
pod install
ここで LC_ALL を設定しているのは、これを記載しておかないと、"pod install" 実行時に次のようなエラーになってしまうためです。
[33mWARNING: CocoaPods requires your terminal to be using UTF-8 encoding.
See https://github.com/CocoaPods/guides.cocoapods.org/issues/26 for possible solutions.[0m
このように設定したら、スキームを CocoaPods にしてビルドを実行するだけで、CocoaPods ライブラリを更新できるようになります。
ビルドを実行して "pod install" が実行されると、ワークスペースファイルが "プロジェクト名.xcworkspace" といった名前で自動生成されます。このワークスペースファイルには、Podfile と同じフォルダーに保存されていたプロジェクトと、今 CocoaPods で取り込んだファイルが格納されたプロジェクトの両方が登録されています。
以降はワークスペースファイルを開いて開発を行う
"pod install" を実行した以降は、そのときに生成されたワークスペースファイルを開いてアプリの開発を進めて行くことになります。
CocoaPods から取り込んだライブラリは "Pods" プロジェクトにまとめられています。
このプロジェクトは、元の Podfile を作成したプロジェクトからすぐに使えるように設定されているので、たとえば CocoaPods から取り込んだライブラリのヘッダーファイルを #import <MMMarkdown.h> のようにして取り込めば、すぐに使い始めることができます。
"pod install" コマンドによって設定が変更される箇所
“pod install” コマンドを実行すると、"Pods" プロジェクトをすぐに利用できるように、元のプロジェクトの設定が自動的に調整されます。
まず、ターゲット設定の Linked Frameworks and Libraries には "libPods.a" が登録されています。
また、プロジェクト設定の Based on Configuration File には “Pods.xcconfig” が追加されていました。アプリのターゲットに対して、Debug と Release の両方で “Pods.xcconfig” が適用されています。
ここで適用されている "Pods.xcconfig" の内容は次のようになっていました。
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers" "${PODS_ROOT}/Headers/MMMarkdown"
OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers" -isystem "${PODS_ROOT}/Headers/MMMarkdown"
OTHER_LDFLAGS = -ObjC
PODS_ROOT = ${SRCROOT}/Pods
この HEADER_SEARCH_PATHS の設定によって、#import <> で CocoaPods のヘッダーファイルを指定できるようになっています。また、OTHER_CFLAGS に指定されている -isystem オプションは、GCC でインクルードパスの先頭につける文字列を指定するものだそうです。
このような設定によって、アプリのプロジェクトから CocoaPods ライブラリを手軽に使えるようになっています。
Podfile と同じ場所にアプリのプロジェクトを用意していない場合
Podfile を用意したフォルダーに Xcode のプロジェクトが用意されていない場合は、そのまま "pod install" を実行すると、次のようなエラーが発生します。
[!] Could not automatically select an Xcode project. Specify one in your Podfile like so:
xcodeproj 'path/to/Project.xcodeproj'
別のパスにあるアプリのプロジェクトを Podfile で指定する
Podfile とは別の場所にアプリのプロジェクトがある場合は、Podfile 内で "xcodeproj" を指定することで対応できます。
platform :ios, ‘7.1’
xcodeproj '../EzApp/EzApp'
pod ‘MMMarkdown’, ‘>= 0.3’
上記の例では、この Podfile があるディレクトリの親ディレクトリにある "EzApp" フォルダーの "EzApp.xcodeproj" プロジェクトで CocoaPods を利用することになります。この "xcodeproj" 設定で指定するのは「プロジェクトファイル (*.xcodeproj)」ですが、この例のように、最後の拡張子 ".xcodeproj" は省略しても構いません。
アプリのプロジェクトに干渉せずに CocoaPods を利用したい場合
CocoaPods を使うときに、アプリのプロジェクト設定が自動で書き換わるのを避けたい場合は、ライブラリを取り込むときに、次のように "--no-integrate" オプションを付けて "pod install" を実行します。
pod install --no-integrate
このようにすると、既存のワークスペースには手をつけずに、Podfile が置いてあるフォルダーに “Pod” フォルダーが作られて、その中に CocoaPods のライブラリが収められた "Pods" プロジェクトが生成されるだけの動作になります。どこかのアプリのプロジェクト設定が変更されることはありません。
この方法だと他のプロジェクトとは関係なく CocoaPods を設定できるため、もちろん Podfile と同じフォルダーに Xcode プロジェクトがなくてもエラーになりません。
アプリ側のプロジェクト設定は調整されないため、ここで作成した "Pods" プロジェクトを使うための設定は自分で行う必要があります。ワークスペースファイルが自動生成されることもないので、どのような方法を使って "Pods" プロジェクトが生成する "libPods.a" ライブラリをアプリに取り込むかは、完全に開発者自身に任されます。
生成された "Pods" フォルダー内には、自動設定のときに使われる Pods.xcconfig ファイルも格納されているので、これを Pods プロジェクトのオブジェクトを使いたい他のプロジェクトに取り込んであげれば、設定がだいぶ楽に済みそうです。
このような方法を使うと、自由な場所に "Pods" プロジェクトを作成して独立して管理できるので、ひとつの "Pods" プロジェクトをいくつかのプロジェクトで共有したい場合に便利そうです。
ただ、オープンソースなライブラリの場合、使ったライブラリの著作情報を明記する必要があることが多く、使わないライブラリも混ぜてビルドするのは得策ではないかもしれません。プロジェクト毎に必要最小限の Pods プロジェクトを分けて作るのも簡単ですし、Podfile を見ればそのプロジェクトで必要なライブラリをすぐに把握できます。
pod install のときに自動生成される、ライセンス表記がまとめられた "Acknowledgements.plist" ファイルも実際の利用に即した適切なものに保たれるので、実際の運用も視野に入れると、ひとつの Pods プロジェクトにまとめるよりも、アプリ毎に個別に用意した方が楽ですし、その方がオープンソースライブラリを利用する立場として、正しい在り方なのかもしれません。
[ もどる ]