自前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
しようとしたらエラーになってしまい、慌てて直したわけで…とほほ。