「CocoaPods」とは?
Cocoa(iOSやmacOSなど)のライブラリ管理ツールです。
Carthageが台頭するまではCocoaPods一択でしたが、今はプロジェクトによってCarthageのみを使ったり、両方を併用して使ったりすることが多いと思います。
Carthageとの主な違いについてはこちらに書いています。
環境
- OS:macOS Mojave 10.14
- Xcode:10.0 (10A255)
- Swift:4.2
- RubyGems:2.7.1
- CocoaPods:1.5.3
CocoaPodsのセットアップ
RubyGemsの更新
まずはRubyGemsを更新します。
$ sudo gem update --system
私の環境では以下のエラーが発生しました。
$ sudo gem update --system
Password:
Updating rubygems-update
Fetching: rubygems-update-3.0.0.gem (100%)
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /usr/bin directory.
RubyGemsが /usr/bin
にインストールされていて、アクセス権限がないのが原因です。
$ which gem
/usr/bin/gem
usr/local/bin
にインストールし直せば解決できると思いますが、手間がかかるので現状のバージョンのままとしました。
CocoaPodsのインストール
RubyGemsからインストールします。
$ sudo gem install -n /usr/local/bin cocoapods
sudo gem install cocoapods
でインストール先を指定せずにインストールすると、 -bash: pod: command not found
となり pod
コマンドが使えないので注意してください。
CocoaPodsのセットアップ
pod setup
コマンドでCocoaPodsの環境をセットアップします。
$ pod setup
セットアップが完了しない場合、以下を実行し、再度 pod setup
を実行するとうまくいくことがあります。
git clone
に時間がかかるので注意です。
$ cd ~/.cocoapods/repos/
$ rm -rf master/
$ git clone https://github.com/CocoaPods/Specs.git master
ライブラリのセットアップ
カレントフォルダの変更
まずはプロジェクトのルートフォルダに移動します。
$ cd {.xcodeprojファイルがあるフォルダ}
Podfileの作成
pod init
コマンドを実行すると、カレントフォルダに Podfile
というファイルが作成されます。
$ pod init
Podfileの編集
PodfileをVimなどのテキストエディタで開きます。
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target '{製品ターゲット名}' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!
# Pods for {製品ターゲット名}
target '{テストターゲット名}' do
inherit! :search_paths
# Pods for testing
end
end
すでにテンプレートが記述されていることがわかるので、1つずつ編集していきます。
対象プラットフォームの指定
コメントに記述されている通り、platformをコメントインして対象のプラットフォームを指定します。
例:
対象OS:iOS
対象バージョン:10.0以上
# Uncomment the next line to define a global platform for your project
- # platform :ios, '9.0'
+ platform :ios, '10.0'
プラットフォームを指定しない場合、 pod update
時などに以下の警告が出力されます。
[!] Automatically assigning platform `ios` with version `12.0` on target `{プロジェクト名}` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.
簡単に訳すと「Podfileにプラットフォームが指定されていないから、勝手にiOSの12.0にしたよ」ということです。
ライブラリの指定
使いたいライブラリを target '{製品ターゲット名}' do
の中に記述していきます。
フォーマットは pod '{ライブラリ名}' '{記号} {バージョン}'
です。
例:
バージョン6.0と互換性のあるGoogleTagManagerを指定
target '{製品ターゲット名}' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!
# Pods for {製品ターゲット名}
+ pod 'GoogleTagManager', '~> 6.0'
…
end
記号の意味は以下の通りです。
記号 | 意味 |
---|---|
> 1.0 | 1.0より大きい最新バージョン |
>= 1.0 | 1.0以降の最新バージョン |
< 1.0 | 1.0より小さいバージョン |
<= 1.0 | 1.0以前のバージョン |
~> 1.0 | 1.0と互換性がある最新バージョン |
なし | 最新バージョン |
ライブラリをテストターゲットに追加
TARGETSでテストターゲットを選択 > Build Settings - Framework Search Paths
$(inherited)
を全てのテストターゲットに記述します。
Carthageなどですでに記述している場合、半角スペース区切りで追加すればOKです。
こちらを記述しないと単体テストの実行時に以下のビルドエラーが発生することがあります。
ld: framework not found {ライブラリ名}
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ビルドエラー以外にも pod update
時などに以下の警告が出力されます。
[!] The `{プロジェクト名}Tests [Debug]` target overrides the `FRAMEWORK_SEARCH_PATHS` build setting defined in `Pods/Target Support Files/Pods-{プロジェクト名}Tests/Pods-{プロジェクト名}Tests.debug.xcconfig'. This can lead to problems with the CocoaPods installation
- Use the `$(inherited)` flag, or
- Remove the build settings from the target.
[Debug] or [Release]×Unit Tests or UITestsで計4つも似たような警告が出力されます。
ユーザーデータの削除
$(inherited)
の追加時に「No Scheme」となってビルドできなくなることがあります。
その場合、プロジェクトからユーザーデータを削除することでスキーマが復活します。
{プロジェクト名}.xcodeprojを右クリック > パッケージの内容を表示
xcuserdata > {ユーザー名}.xcuserdatadをフォルダごと削除
ライブラリのインストール
Xcodeを終了し、以下のコマンドを実行します。
$ pod install
インストールが完了すると {プロジェクト名}.xcworkspace
というファイルが作成されるので、{プロジェクト名}.xcodeproj
ではなくこちらを開くようにします。
Podfile.lockというファイルも作成されます。
こちらのファイルには実際にインストールしたライブラリのバージョンが記述されています。
Podfile.lockが存在するときに pod install
を実行すると、 Podfileを見ずにPodfile.lockのみを見てライブラリをインストール します。
開発者同士でライブラリのバージョンを合わせるときに使います。
ライブラリの更新
pod update
コマンドを実行すると、Podfileに記述した全てのライブラリが更新されます。
$ pod update
Podfile.lockも更新されます。
特定のライブラリのみ更新したい場合、半角スペース区切りでライブラリを指定することで行えます。
$ pod update {ライブラリ名1} {ライブラリ名2} ...
バージョン管理から無視する
インストールされたライブラリは Pods
フォルダ内に格納されます。
サイズが大きいため、 Pods
フォルダごとバージョン管理の対象外にすべきです。
Gitを使っている場合、以下を .gitignore に追加するのみでOKです。
Pods
CocoaPodsのバージョンアップ
RubyGemsからバージョンアップします。
$ sudo gem update -n /usr/local/bin cocoapods
おわりに
これでライブラリが使えるようになります!
GTMやCrashlyticsなど、公式がCocoaPodsからのインストールのみを紹介しているライブラリはまだ多いので、Carthageとうまく併用しつつ、素晴らしいライブラリライフを送りましょう