自前CocoaPodsライブラリで公開するヘッダファイルを限定する方法

CocoaPodsは、自動作成するumbrellaヘッダにデフォルトで全ヘッダファイルを含めます。

Objective-Cだけで書いてある場合、この振る舞いでも特に問題にはなりません。・・・ですが、ライブラリにC++コードなどSwiftで対応しない言語のファイルが含まれているとなれば、話は別です。

CocoaPodsでc++ソースを含む自前ライブラリを何も考えずに公開しようとしても、umbrellaヘッダにc++向けヘッダファイルまでも全て含まれてしまい、Swift環境でコンパイルできなくなってしまうのです。C++で作ったライブラリをSwiftで使う場合、Objective-C++で作成したファイルをブリッジとして、Swift側からはc++のコードが見えないようにしなければいけないのに、です。

umbrellaヘッダに含めるヘッダファイルを限定したい場合、.podspecファイルでs.public_header_filesを使います。

# umbrellaヘッダでのinclude対象になるファイルを指定するオプション
s.public_header_files = ["Core/*.h", "Tree/**.h"]

s.source_filesは、コンパイルに必要なファイルを指定するのに対して、今回紹介するs.public_header_filesはumbrellaヘッダに含めるファイルを指定するのに使います。複数ある場合は配列で指定します。

以下はサンプルです。末尾にs.public_header_filesがあります。

Pod::Spec.new do |s|
    s.name         = "MyLibrary"
    s.version      = "1.0.0"

    s.description  = <<-DESC
    MyLibrary is an awesome library!
    DESC

    s.homepage     = "https://github.com/foobar/MyLibrary"
    s.source       = { :git => "https://github.com/foobar/MyLibrary.git", :tag => "v#{s.version}" }

    s.license      = "New BSD"
    s.author       = "Foo Bar"

    s.platform     = :ios
    s.ios.deployment_target = "8.0"

    s.requires_arc = true
    s.frameworks   = 'Foundation'
    s.module_name  = "MyLibrary"
    s.source_files = "MyLibrary/**/*.{h,cpp,mm,swift}" # コンパイルに必要な全ソースファイル
    s.public_header_files = ["MyLibrary/MyLibrary.h", "MyLibrary/PublicHeader.h"]  # umbrellaヘッダでのinclude対象
end

こっそり公開しているライブラリを自分でpod installしようとしたらエラーになってしまい、慌てて直したわけで…とほほ。

参考サイト

blog.cocoapods.org