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