86
84

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CocoaPods podspec作成の逆引きいろいろ

Last updated at Posted at 2013-05-14

当初ドキュメントがあまり網羅されていなかったりしたので今までやろうとしたことの逆引き的なメモ。完成の終わりがわからないので随時更新(予定)。

一つのPodをモジュールごとに分割するよ

subspecを使う。

podspec
  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の名前を/で区切り以下のように指定する。

podspec
pod 'MyPodName/ModuleA'

Pod内でもモジュール間の依存関係を解決できる。

podspec
  s.subspec 'Core' do |a|
  end
  s.subspec 'ModuleA' do |b|
	b.dependency 'MyPodName/Core'
  end

さらにはmainspecをsubspecに依存させることもできる。

podspec
  s.subspec 'ModuleA' do |a|
  end
  s.dependency 'MyPodName/ModuleA'

ARC無効にするよ

requires_arcを設定する。CocoaPods 0.17.0からデフォルトが true (ARC有効) 、それ以前が false (ARC無効)なので、どちらの設定にせよ明示的に書くべき。

podspec
s.requires_arc = false

Pod内の特定のファイルだけARCを無効にするよ

subspecを利用してPodを分割して、設定をわけて、そのsubspecに依存させる。

podspec
  s.name         = 'MyPodName'
  s.requires_arc = true
  
  
  s.subspec 'NoARC' do |sub|
    
    sub.requires_arc = false
  end

  s.dependency 'MyPodName/NoARC'

libxml2とか使うよ

SDKのスタティックライブラリを使う場合。

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

STL使うからリンクするよ

podspec
s.libraries = 'stdc++'

プリコンパイルヘッダ使うよ

prefix_header_contents に設定する。以下のようにRubyのヒアドキュメントを使うこともできる。

ただしsubspecを使った場合に親のprefix_header_contentsが反映されることがあり、何度もprefix_header_contentsが実行されてしまうことがあるのでsubspecを使っている場合にはCoresubspecみたいなものを別につくってそこに書いた方がいい。

podspec
  s.prefix_header_contents = <<EOC
#ifdef __OBJC__
    #import <SystemConfiguration/SystemConfiguration.h>
#endif
EOC

Static Libraryを含めるよ

Static Libraryで配布されている外部のSDKをPodにする場合に有効。

podspec
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を使う場合、

Podfile
pod 'MyPodName', :local => '~/Pods/MyPodName'

のようにPodfileがかけるが、アプリプロジェクトからは相対パスで参照される。従って、アプリのプロジェクトから見れば $(PODS_ROOT)/MyPodName にファイルがないため、'LIBRARY_SEARCH_PATHS' => '"$(PODS_ROOT)/MyPodName/lib"' という指定は使えない。

そのPodをlocalだけで使う前提でいいなら、以下のように設定を絶対パスにすることで強引にいける。

podspec
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が非推奨になった

podspec
s.public_header_files = FileList['MyPodName/*.h'].exclude(/\+(:?Local|Private)\.h/)

正規表現で頑張る

文字列ではなく正規表現のリテラルを使う

podspec
s.public_header_files = /MyPodName\/[\w_-]+(?!\+Private|\+Local)\.h/;
86
84
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
86
84

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?