82
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

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

一つの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/;
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
82
Help us understand the problem. What are the problem?