Hatena::ブログ(Diary)

Watsonのメモ RSSフィード

2011-12-05

CocoaPods ではじめる Objective-C ライブラリ管理 (2)

2011 年の Mac Dev JP advent calendar 5 日目の記事です。CocoaPods ではじめる Objective-C ライブラリ管理 (1) の続きです。

CocoaPods はとても有益なツールだと思います。しかしながら、公式にサポートしているライブラリの種類が CocoaPods/Specs に登録されているものだけです。今日は、CocoaPods/Specs に登録されていないライブラリを CocoaPods で扱う方法について書きます。

登録されていないライブラリを扱うには 2 つ方法があります。

1. Podfile にライブラリ情報を記述する

昨日、Podfile を記述してライブラリをインストールする方法を書きました。その記事では CocoaPods に登録されいるライブラリを扱っているのみでした。Podfile には、どこからライブラリをダウンロードして、どのファイルをプロジェクトに追加するかを記述することができます。

執筆時点で CocoaPods/Specs に登録されていない、Chameleon というライブラリの UIKit を使ってみましょう。Podfile に以下のように記述します。

platform :osx

dependency do |spec|
  spec.source = { :git => 'https://github.com/BigZaphod/Chameleon.git' }
  spec.source_files = 'UIKit/Classes/*'
  spec.resources    = 'UIKit/Resources/*.png'
  spec.name = 'UIKit'
  spec.framework = 'IOKit', 'QuartzCore', 'SystemConfiguration', 'AppKit', 'Foundation', 'QTKit', 'WebKit'
end

GitHub の Chameleon レポジトリからソースを取得し、プロジェクトに UIKit/Classes/ 以下のファイルを追加します。Chameleon が依存する Framework を指定しています。記述できる内容については、2 つ目の方法と重複するので後ほど記載します。

ライブラリをインストールします。

$ pod install CocoaPodsSample.xcodeproj
Updating spec repo `master'
Using UIKit ()
Generating support files

1回きりしか Chameleon を使わないのであればこれでも良いかと思いますが、何度も使いたい場合には 2 つ目の方法を使用するとスマートかと思います。

ちなみに、想定外の使い方だったのか、コードを変更しないとリソース画像が表示されませんでした。。。

diff --git a/Pods/UIKit/UIKit/Classes/UIImage+UIPrivate.m b/Pods/UIKit/UIKit/Classes/UIImage+UIPrivate.m
index 3b292f4..bf2381a 100644
--- a/Pods/UIKit/UIKit/Classes/UIImage+UIPrivate.m
+++ b/Pods/UIKit/UIKit/Classes/UIImage+UIPrivate.m
@@ -108,7 +108,7 @@ NSMutableDictionary *imageCache = nil;
     UIImage *image = [self _cachedImageForName:name];
 
     if (!image) {
-        NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"org.chameleonproject.UIKit"];
+        NSBundle *frameworkBundle = [NSBundle mainBundle];
         NSString *frameworkFile = [[frameworkBundle resourcePath] stringByAppendingPathComponent:name];
         image = [[self imageWithContentsOfFile:frameworkFile] stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:topCapHeight];
         [self _cacheImage:image forName:name];

2. PodSpec を記述し、ライブラリ情報を定義する

2つ目の方法として、CocoaPods/Specs のようにライブラリ情報が書かれたファイルを用意します。

Terminal.app で 'pod spec create' コマンドを実行すると、PodSpec ファイルのひな形ができます。

$ pod spec create UIKit
$ ls  
UIKit.podspec

「UIKit.podspec」というファイルができます。このファイルに書かれたコメントを読みながら、必要な情報を書きこんでいきます。(ちゃんとしたドキュメントがまだ用意されていないようです)

Pod::Spec.new do |s|
  s.name     = 'UIKit'
  s.version  = '0.0.0'
  s.license  = 'BSD'
  s.summary  = "Chameleon is a port of Apple's UIKit (and some minimal related frameworks) to Mac OS X."
  s.homepage = 'https://github.com/BigZaphod/Chameleon'
  s.author   = 'Sean Heber'

  s.source   = { :git => 'https://github.com/BigZaphod/Chameleon.git' }
  s.platform = :osx

  s.source_files = 'UIKit/Classes/*'
  s.resources = "UIKit/Resources/*.png"

  s.frameworks = 'IOKit', 'QuartzCore', 'SystemConfiguration', 'AppKit', 'Foundation', 'QTKit', 'WebKit'
end

PodSpec で記述する各項目について以下で説明します。1 つ目の Podfile で記述した内容も同じです。

属性内容
name ライブラリの名称
version ライブラリのバージョン
license ライブラリに適用されているライセンスを記入します。(MIT、BSD、GPL2など)
summary ライブラリの簡単な説明を記入します。
homepage ライブラリが公開されている URL を記入します。
author 著作者の情報を記入します。

s.author = { 'Watson' => 'watson1978@gmail.com' }

メールアドレスを公開しない場合には、

s.author = 'Watson'

で良いようです。

source ソースコードを入手するためのリポジトリ URL を記入します。

s.source = { :git => 'https://github.com/BigZaphod/Chameleon.git’ }

特定の TAG を取得する場合には、

s.source = { :git => 'https://github.com/BigZaphod/Chameleon.git’ , :tag => 'xxxx' }

特定のコミットを取得する場合には、

s.source = { :git => 'https://github.com/BigZaphod/Chameleon.git’ , :commit => 'xxxx' }

SubversionMercurial レポジトリから取得する場合には、

s.source = { :svn => 'http://EXAMPLE/test/tags/1.0.0’ }

s.source = { :hg => 'http://EXAMPLE/test’, :revision => '1.0.0' }

と記述します。

source_files ライブラリで実際に使用するソースファイルを指定します。

'UIKit/Classes/' 以下の *.m と *.h を使用する場合には、

s.source_files = 'UIKit/Classes/*.m', 'UIKit/Classes/*.h'

のようになります。

ここまでは(たぶん)必須の設定項目になります。以下はオプションの設定項目です。

属性内容
platform 依存するプラットフォームを記入します。iOS でしか動作しないものであれば、:iosMac OS X のみでれば :osxと記入します。どちらのプラットフォームでも動作するライブラリの場合には未記入とします。
resourceresources 使用するリソースファイルを指定します。

リソースファイルが 1 つのみであれば、

s.resource = "icon.png"

複数のリソースファイルを扱う場合には、

s.resources = "Resources/*.png"

と記述します。

clean_pathclean_paths ライブラリで不要なファイルを指定します。例えば、Examples や doc など不要であれば、clean_path で指定することで、pod install コマンド実行時にファイルが削除されるようになります。

s.clean_path = "examples"

s.clean_paths = "examples", "doc"

frameworkframeworks 依存する Framework を指定します。

s.framework = 'SomeFramework'

s.frameworks = 'SomeFramework', 'AnotherFramework'

librarylibraries 依存する library を指定します。

s.library = 'iconv'

s.libraries = 'iconv', 'xml2'

requires_arc ライブラリが ARC を必要とするかを指定します。ARC が必要な場合には、

s.requires_arc = true

と記述します。

xcconfig ビルド設定を追加する必要がある場合に使用します。

s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' }

dependency CocoaPods で扱えるライブラリに依存している場合に使用します。

s.dependency 'JSONKit', '~> 1.4'

記述した PodSpec ファイルに誤りがないか、'pod spec lint' コマンドで確認できます。

$ pod spec lint UIKit.podspec

もし記述に誤りがあればエラーが表示されるので、エラーが無くなるまで修正します。

できあがった、UIKit.podspec ファイルを以下のように "ライブラリ名/バージョン番号/ライブラリ名.podspec" という階層構造で保存します。

f:id:Watson:20111203224510p:image

これを GitHub にプッシュすれば、CocoaPods/Specs と同じようなディレクトリ構成になっているかと思います。最後に、'pod repo add' コマンドでレポジトリに追加すると、自分専用のライブラリ定義を使えるようになります。

$ pod repo add my_pods git://github.com/Watson1978/podspec.git
Cloning spec repo `my_pods' from `git://github.com/Watson1978/podspec.git'

git://github.com/Watson1978/podspec.git は私が作ったレポジトリです。~/.cocoapods にレポジトリが追加されます。

$ cd ~/.cocoapods/; ls
master/  my_pods/

これで UIKit を使うときには、

platform :osx
dependency 'UIKit'

と Podfile に記述するだけとなります。

定義したライブラリ情報を複数の方や、複数プロジェクトで使用したり、または CocoaPods に pull request することができるでしょう。


以上、長くなりましたが 2 日にわたり CocoaPods の使い方について書きました。CocoaPods はまだできたばかりのプロジェクトなので、日々新しくなり、ここに書いた内容が古くなると思います。公式サイトの情報もご確認ください。そして、不具合を見つけた場合には、@CocoaPodsOrg 宛につぶやくか、GitHub の issue に報告してください。

Enjoy! :)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/Watson/20111205/mac_dev_jp_advent_calendar_cocoapods02