CocoaPods / Objective-C 向け ライブラリ/パッケージマネージャの紹介

https://github.com/CocoaPods/CocoaPods

CocoaPods はObjective-C 開発者向けのライブラリ 管理ツールです。ruby で実装されたpod コマンドが bundler(rubygems) や npm(node) のような機能を提供します。アフターgithubツールの流行らしくバックエンドにはgit リポジトリなどを使います。

CocoaPods のインストール

なぜかMacRuby の最新版*1に依存しているので事前にインストールが必要*2。今現在だと0.10 が推奨されてる

$ curl -O http://www.macruby.org/files/MacRuby%200.10.zip
$ open MacRuby%200.10.zip
$ open MacRuby\ 0.10/MacRuby\ 0.10.pkg

macgem というコマンドが使えるようになるので、それ経由でCocoaPods をインストール

$ sudo macgem install cocoapods
$ pod setup

セットアップが完了したら、検索コマンドが利用できるようになる。

$ pod search json
==> JSONKit (1.4)
    A Very High Performance Objective-C JSON Library.

==> RestKit-JSON-JSONKit (0.9.3)
    Part of RestKit, which is a framework for consuming and modeling RESTful web resources on iOS and OS X.

==> SBJson (3.0.4)
    This library implements strict JSON parsing and generation in Objective-C.

ただ、今現在はそんなにライブラリは登録されてない。だいたい https://github.com/CocoaPods/Specs にあるもの。

やってみよう:新しいプロジェクトでCocoaPods を使ってライブラリを管理する

Xcode で新規のiOSプリプロジェクト作成して(CocoaPodsTutrial.xcodeproj とします)、プロジェクトディレクトリに移動。

Podfile というテキストファイルを作成する

$ cat Podfile 
platform :ios
dependency 'JSONKit',           '~> 1.4'
dependency 'Reachability',      '~> 2.0.4'

インストール

$ pod install CocoaPodsTutrial.xcodeproj 

Pods ディレクトリ以下に依存モジュールともどもごっそりインストールされます

$ tree Pods -L 1
Pods
├── ASIHTTPRequest
├── JSONKit
├── JSONKit.podspec
├── Pods-Prefix.pch
├── Pods.xcconfig
├── Pods.xcodeproj
├── PodsResources.sh
└── Reachability.podspec

その後単一のXcode プロジェクトファイルではなく、Xcode ワークスペースファイルを開きます。

$ open CocoaPodsTutrial.xcworkspace

そうするとこんな感じ。

20111116182214

まずPods をビルドするとlibPods.a のファイルができあがります。その後CocoaPodsTutrial をビルドできるようになるんですが、この例だとなぜかSystemConfiguration.framework が必要になったので*3手動で追加してください*4

20111116183311

ここまでするとCocoaPodsTutrial がビルドできるようになり。アプリを動かすことができます。

では目的のライブラリの呼出が正常にできるかも確認してみます。JSONKitを使ってみます。AppDelegate.m を書き換えてしまいましょう。

#import "JSONKit.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  NSString* jsonString = @"{\"perl\": \"cpan\", \"python\": \"pip\", \"objc\": \"pod\"}";
  NSData* json = [jsonString dataUsingEncoding:NSUTF8StringEncoding];  
  JSONDecoder* decoder = [[JSONDecoder alloc] init];
  NSError* err = nil;
  NSDictionary *result = [decoder objectWithData:json error:&err];
  [result enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
    NSLog(@"%@: %@", key, obj);
  }];

  return YES;
}
2011-11-16 18:53:48.916 CocoaPodsTutrial[49428:f803] perl: cpan
2011-11-16 18:53:48.917 CocoaPodsTutrial[49428:f803] python: pip
2011-11-16 18:53:48.918 CocoaPodsTutrial[49428:f803] objc: pod

無事利用することができました。

まとめ

CocoaPods を利用することで、依存モジュールのインストール、ビルドの手間がおおいに省けました。

またCocoaPods には、この本来のライブラリを管理する役割とは別にiOS 5 からくわわったARC の仕組みと、既存ライブラリ資源を協調しやすくする役割も期待されています。依存の外部モジュールを静的ライブラリにおしこめてビルドすることで既存ライブラリでのみARC を無効にしたメモリ管理をし、一方開発者は新たなプロジェクトでコンパイラオプションなどを気にしなくてもARC を有効にして自由に使うことができます。

CocoaPods はまだ発展途上のプロジェクトですが、今後インストールできるライブラリの数などの増加が期待されています。ライブラリを提供する人向けの情報などもありますのでよかったらCocoaPods プロジェクトのwikiを参照ください。

https://github.com/CocoaPods/CocoaPods/wiki

*1:とくに強調する必要なかった

*2:要望があればそのうちシステムのruby だけで動くようになる気もするけど → どうもXcode プロジェクトの設定ファイルをいじるのに必要らしい

*3:http://bit.ly/rEFzyX

*4:これは古いCocoaPods のSpecレポジトリからReachability をインストールした時の問題っぽいので、たぶん今からはじめるぶんにはおこらなそう