Podfile Syntax
#CocoaPods
以下がリファレンス。要約をここにまとめておく。
https://guides.cocoapods.org/syntax/podfile.html
設定の対象としては以下がある。
Podfile に対する設定
Pod に対する設定
Xcode Target に対する設定
Workspace に対する設定
Source の設定
Hook の設定
Podfile に対する設定
install!
CocoaPods が Podfile からインストールするときのインストール方法を定義する。インストール方法は現状は 'cocoapods' のみ。ほとんど使われていないっぽい
:clean デフォルトは true。podspec で指定された pod やプロジェクトがサポートしているプラットフォームで利用されていないファイル群を削除する
:deduplicate_targets 0.38 から入っているようだ。条件を満たしていれば、同一のライブラリが複数箇所で利用されている場合にそれらを重複してインストールはさせない。
異なるプラットフォームで利用されている場合
異なる subspec を持っている場合
重複する必要のある依存を持っている倍
:deterministic_uuids Pods プロジェクtの生成時に UUID を生成するか
:integrate_targets プロジェクトに pod をインテグレーションするか
false にすると Pod ディレクトリ以下にダウンロードされるだけで Xcode プロジェクトにリンクされない
:lock_pod_sources pods のソースファイルをロックするか
編集時はXcodeによりアンロックされる。pod install 時に重い場合は false にしてみてもよい
:warn_for_multiple-pod_sources 複数のソースが同名同バージョンの Pod を含んでいるときにwarnを出すか
:generate_multiple_pod_projects target 毎にプロジェクトを生成するか
:incremental_installation 前回のインストール時から変更があった場合のみtargetを再生成するか
code:bash
install! 'cocoapods',
:deterministic_uuids => false,
:integrate_targets => false
Pod に対する設定
pod
プロジェクトの依存 を定義する。下記リファレンスの要約。
https://guides.cocoapods.org/syntax/podfile.html#pod
pod のバージョンを指定する
= 0.1 バージョン 0.1 に固定
> 0.1, < 0.1 0.1 より大きい, 小さい
>= 0.1, <= 0.1 0.1 以下, 以上
~> 0.1.2 0.2 より小さく 0.1.2 以上。マイナーバージョンはあげないがパッチバージョンはあげる
code:bash
# 名前のみ
pod 'SSZipArchive'
# バージョンを指定
pod 'Objection', '0.9
pod をプロジェクトの特定の Build Configuration にのみインストールする
依存は、デバッグやそのほかの目的から、対象プロジェクトの特定の Build Configuration にのみインストールさせることができる。しかし、推移的な依存は全ての configuration にインストールされる ので、それを避けたければ明示的に Build configuration を指定するしかない。
code:bash
pod 'PonyDebugger', :configurations => 'Debug', 'Beta'
pod 'PonyDebugger', :configuration => 'Debug'
pod の Moduler Headers の有効化/無効化
Modular Headers 機能を pod 単位で有効化、無効化できる。
code:bash
pod 'SSZipArchive', :modular_headers => true
# use_modular_headers! 属性を有効にしている場合は、pod 毎に無効化できる
pod 'SSZipArchive', :modular_headers => false
pod の探索先の指定
依存の探索先を明示できる。
code:ruby
pod 'PonyDebugger', :source => 'https://github.com/CocoaPods/Specs.git'
pod の subspec の指定 (一部のみをインストール)
pod 内の特定の subspec のソースファイル群のみインストールする。
code:ruby
pod 'QueryKit/Attribute'
# 複数指定
pod 'QueryKit', :subspecs => 'Attribute', 'QuerySet'
pod の Test Specs を含んだインストール
デフォルトでは、test spec はインストールされないが、これを明示的にインストールさせることができる。
code:ruby
pod 'AFNetworking', :testspecs => 'UnitTests', 'SomeOtherTests'
ローカルの pod を利用する
pod を開発中等の理由でローカルにあるpodを利用したい場合には、:path で指定する。この指定をした場合、指定ディレクトリが pod のルートディレクトリと認識され、そこ以下のファイルが Pods project 内に 直接 リンクされる。そのため、リンク先のファイルを編集すると反映される。podspec ファイルがフォルダ内に存在することが想定される。
code:ruby
pod 'AFNetworking', :path => '~/Documents/AFNetworking'
開発段階の pod を利用する
podspec ファイルがリポジトリのルートに存在することが期待される。存在しない場合は明示的に指定する必要がある (後述)。
code:ruby
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev'
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af'
外部に存在する podspec を利用する
podspec がライブラリのリポジトリの外に存在する場合、HTTP 経由で podspec にアクセスさせることができる。
code:ruby
pod 'JSONKit', :podspec => 'https://example.com/JSONKit.podspec'
podspec
利用する podspec ファイルを指定できるようだ。オプションがない場合は root ディレクトリのものが利用されるようだ。使うことがあるのか?ちょっと思いつかない。
code:ruby
podspec
podspec :name => 'QuickDialog'
podspec :path => '/Documents/PrettyKit/PrettyKit.podspec'
target
Xcode Target 毎に設定や pod を指定できる。デフォルトでは、target ブロック外の依存の定義は継承される。これは inherit! オプションを付加することで無効化できる。
code:ruby
target 'ZipApp' do
pod 'SSZipArchive'
end
script_phase
Cocoapods が作成する Xcode Target に Xcode の環境変数を利用した任意のスクリプトを実行できる。後から削除すればスクリプトも削除される。
code:ruby
script_phase :name => 'HelloWorldScript', :script => 'echo "Hello World"'
script_phase :name => 'HelloWorldScript', :script => 'puts "Hello World"', :shell_path => '/usr/bin/ruby'
abstract_target
Xcode Target の継承の依存関係を助けるための抽象的な target を追加できる。
code:ruby
# Shows というターゲットは Xcode Project 内に存在しない
abstract_target 'Shows' do
pod 'ShowsKit'
# Xcode Target ShowsiOS は、ShowsKit 及び ShowWebAuth を含む
target 'ShowsiOS' do
pod 'ShowWebAuth'
end
end
abstract!
現在の Xcode Target が抽象 target であることを示す。
inherit!
target 毎に継承モードの設定を行う。設定可能な継承モードは以下
:complete 親から全ての振る舞いを継承する
:none 親から何も継承しない
:search_paths 探索パスのみ親から継承する
:search_paths がいう 探索パス というのがなんなのかイマイチわからなかった。これは、デフォルト以外の Framework を追加した場合の、その探索パス のことを言っているのではないかと思われる。
ある Xcode Target にて、import はしたいが依存への直接の link はしたくない時に使うもので、test の Xcode Target によく利用される、とのこと。
https://stackoverflow.com/questions/37060065/what-does-inherit-search-paths-do
https://github.com/CocoaPods/CocoaPods/issues/6537#issuecomment-285956125
Xcode Target に対する設定
platform
どの静的ライブラリをビルドするか定義する。CocoaPods のバージョン毎にデフォルト値が決まっているようだ。設定できるプラットフォームには :osx, :ios, :tvos, :watchos が存在する。
code:ruby
platform :ios, '4.0'
platform :ios
project
Xcode Project を定義する。xcodeproj は deprecated で、その代替。この設定がなく、かつ Podfile が存在するディレクトリ内にプロジェクトが1つのみであったなら、そのプロジェクトが利用される。ディレクトリ内にプロジェクトが複数存在する場合、このオプションを利用することで複数プロジェクトの設定を1つの Podfile 内に記述できる。
code:ruby
target 'MyGPSApp' do
project 'FastGPS'
...
end
target 'MyNotesApp' do
project 'FastNotes'
...
end
hash という設定を build_configurations としてオプションに追加できる。hash は文字列のキーとシンボルの値から成る。キーは、Xcode Project 内の build configurations の名前、シンボルは :debug もしくは :release で、どちらの設定に従うかを示す。デフォルトだと :release になる。
code:ruby
project 'TestProject', 'Mac App Store' => :release, 'Test' => :debug
inhibit_all_warnings!
warning を出力させない。
code:ruby
# 一部のみ禁止する
pod 'SSZipArchive', :inhibit_warnings => true
# 全体を禁止し、一部のみ禁止しない
inhibit_all_warnings!
pod 'SSZipArchive', :inhibit_warnings => false
use_modular_headers!
静的ライブラリに Modular Headers を利用する。
code:ruby
# 一部のみ利用する
pod 'SSZipArchive', :modular_headers => true
# 全体で利用し、一部のみ利用しない
use_modular_headers!
pod 'SSZipArchive', :modular_headers => false
use_frameworks!
pod の静的ライブラリの代わりに、Framework を利用する。
Workspace に対する設定
workspace
明示しない場合は、Podfile が配置されたディレクトリ内の Workspace が選択される。明示的に 1 つのみ指定できる。
code:ruby
workspace 'MyWorkspace'
generate_bridge_support!
インストールした pod から、BridgeSupport メタデータドキュメントを生成するか定位できる。MacRuby, Nu, JSCocoa といった、bridge types/functions を利用するスクリプト言語のための設定。
set_arc_compatibility_flag!
OTHER_LD_FLAGS に、-fobjs-arc フラグを追加する。non-ARC プロジェクトのコンパイラバグのための workaround。CocoaPods 1.0 でドロップされている (らしい)。
Source の設定
グローバルな設定であり、target 毎に保存されたりはしない。
source
source というのは、spec の場所 を指す。公式の CocoaPods の source は暗黙的であるが、これを明示的に指定したい場合に利用する。source が複数定義されていた場合、より前に定義された source から優先的に pod を取得する。
code:ruby
source 'https://github.com/artsy/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'
Hooks の設定
Podfile における Hook とは、インストール処理時に呼び出される hook である。グローバルな設定であり、target 毎に保存されることはない。
plugin
インストール時に実行する plugin とその引数を定義できる。
code:ruby
plugin 'cocoapods-keys', :keyring => 'Eidolon'
plugin 'slather'
pre_install
pod のダウンロード後、インストール前 に実行する hook を設定できる。Pod::Installer を引数にとる。
code:ruby
pre_install do |installer|
# Do something fancy!
end
post_install
Xcode Project の生成後、ディスク書き込み前 に実行する hook を設定できる。Pod::Installer を引数にとる。
code:ruby
post_install do |installer|
# Do something fancy!
end
supports_swift_versions
サポートする swift のバージョンを定義できる。この設定は継承され、もっとも広範なスコープで定義された設定が優先される。
code:ruby
target 'MyApp' do
supports_swift_versions '>= 3.0', '< 4.0'
pod 'AFNetworking', '~> 1.0'
end