Edited at

Cocoaのライブラリ管理ツール「CocoaPods」のセットアップ&操作方法


「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などのテキストエディタで開きます。


Podfile

# 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です。


.gitignore

Pods



CocoaPodsのバージョンアップ

RubyGemsからバージョンアップします。

$ sudo gem update -n /usr/local/bin cocoapods


おわりに

これでライブラリが使えるようになります!

GTMやCrashlyticsなど、公式がCocoaPodsからのインストールのみを紹介しているライブラリはまだ多いので、Carthageとうまく併用しつつ、素晴らしいライブラリライフを送りましょう


参考リンク