当初ドキュメントがあまり網羅されていなかったりしたので今までやろうとしたことの逆引き的なメモ。完成の終わりがわからないので随時更新(予定)。
一つのPodをモジュールごとに分割するよ
subspecを使う。
s.subspec 'ModuleA' do |a|
a.source_files = 'ModuleA/*.{h,m}'
a.dependency 'Reachability'
end
s.subspec 'ModuleB' do |b|
b.source_files = 'ModuleB/*.{h,m}'
end
source_files
の指定上、予めソースファイルをディレクトリごとに分けておくと管理しやすい。
アプリで使ってもらうときはPodの名前とsubspecの名前を/
で区切り以下のように指定する。
pod 'MyPodName/ModuleA'
Pod内でもモジュール間の依存関係を解決できる。
s.subspec 'Core' do |a|
end
s.subspec 'ModuleA' do |b|
b.dependency 'MyPodName/Core'
end
さらにはmainspecをsubspecに依存させることもできる。
s.subspec 'ModuleA' do |a|
end
s.dependency 'MyPodName/ModuleA'
ARC無効にするよ
requires_arc
を設定する。CocoaPods 0.17.0からデフォルトが true
(ARC有効) 、それ以前が false
(ARC無効)なので、どちらの設定にせよ明示的に書くべき。
s.requires_arc = false
Pod内の特定のファイルだけARCを無効にするよ
subspecを利用してPodを分割して、設定をわけて、そのsubspecに依存させる。
s.name = 'MyPodName'
s.requires_arc = true
…
s.subspec 'NoARC' do |sub|
…
sub.requires_arc = false
end
s.dependency 'MyPodName/NoARC'
libxml2とか使うよ
SDKのスタティックライブラリを使う場合。
s.libraries = 'xml2'
s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' }
STL使うからリンクするよ
s.libraries = 'stdc++'
プリコンパイルヘッダ使うよ
prefix_header_contents
に設定する。以下のようにRubyのヒアドキュメントを使うこともできる。
ただしsubspecを使った場合に親のprefix_header_contents
が反映されることがあり、何度もprefix_header_contents
が実行されてしまうことがあるのでsubspecを使っている場合にはCore
subspecみたいなものを別につくってそこに書いた方がいい。
s.prefix_header_contents = <<EOC
#ifdef __OBJC__
#import <SystemConfiguration/SystemConfiguration.h>
#endif
EOC
Static Libraryを含めるよ
Static Libraryで配布されている外部のSDKをPodにする場合に有効。
s.preserve_paths = 'lib/libExternal.a'
s.library = 'External'
s.xcconfig = { 'LIBRARY_SEARCH_PATHS' => '"$(PODS_ROOT)/MyPodName/lib"' }
localで使うPodだけどStatic Libraryを含めるよ
この方法は0.17か0.18あたりで使えなくなった。localのPodがPods/Local Podspecs
にコピーされて使われるため。MYPODNAME_ROOT
が意図通りの値にならない。
ローカルにあるpodを使う場合、
pod 'MyPodName', :local => '~/Pods/MyPodName'
のようにPodfileがかけるが、アプリプロジェクトからは相対パスで参照される。従って、アプリのプロジェクトから見れば $(PODS_ROOT)/MyPodName
にファイルがないため、'LIBRARY_SEARCH_PATHS' => '"$(PODS_ROOT)/MyPodName/lib"'
という指定は使えない。
そのPodをlocalだけで使う前提でいいなら、以下のように設定を絶対パスにすることで強引にいける。
s.xcconfig = {
"MYPODNAME_ROOT" => File.dirname(__FILE__),
'HEADER_SEARCH_PATHS' => '"$(MYPODNAME_ROOT)/include"',
'LIBRARY_SEARCH_PATHS' => '"$(MYPODNAME_ROOT)/lib"'
}
LocalとかPrivateカテゴリのヘッダ隠蔽するよ
非推奨 Rake::FileList 版
FileList.excludeで正規表現つかって除外する。
CocoaPods 0.17からRake::FileListが非推奨になった
s.public_header_files = FileList['MyPodName/*.h'].exclude(/\+(:?Local|Private)\.h/)
正規表現で頑張る
文字列ではなく正規表現のリテラルを使う
s.public_header_files = /MyPodName\/[\w_-]+(?!\+Private|\+Local)\.h/;