トラブルシューティングのお手伝いで CocoaPods や TravisCI まわりに関して調べたので、その内容を記録しておく。
CocoaPods とは
Swift や Object-C 開発で利用されるライブラリ管理ツール。
24000 以上のライブラリがリポジトリ上で管理されており、インターネット環境を通して登録ライブラリを簡単にインストールできる。
さらに、プロダクトに必要なライブラリやバージョンを明記したファイル(Podfile と呼ばれる)をリポジトリのルートディレクトリに配置しておくことで、開発環境の準備作業を自動化できる。
具体的には、CocoaPods が提供する pod コマンドを実行することで、ワンオペレーションで必要な依存ライブラリがインストールと、XCode のプロジェクトファイルの作成が実行される。
$ pod install
CocoaPods のライブラリ管理
各ライブラリのメタ情報を管理するリポジトリは GitHub 上にホスティングされている。(https://github.com/CocoaPods/Specs)
/Specs/{ライブラリ名}/{バージョン番号} 以下に配置されている podspec ファイルに JSON 形式で記載されている。
例として、https://github.com/CocoaPods/Specs/blob/master/Specs/Nimble/5.0.0/Nimble.podspec.json を引用する。
{
"name": "Nimble",
"version": "5.0.0",
"summary": "A Matcher Framework for Swift and Objective-C",
"description": "Use Nimble to express the expected outcomes of Swift or Objective-C expressions. Inspired by Cedar.",
"homepage": "https://github.com/Quick/Nimble",
"license": {
"type": "Apache 2.0",
"file": "LICENSE.md"
},
"authors": "Quick Contributors",
"platforms": {
"ios": "8.0",
"osx": "10.10",
"tvos": "9.0"
},
"source": {
"git": "https://github.com/Quick/Nimble.git",
"tag": "v5.0.0"
},
"source_files": "Sources/**/**/*.{swift,h,m}",
"private_header_files": "Sources/NimbleObjectiveC/CurrentTestCaseTracker.h",
"exclude_files": "Sources/Nimble/Adapters/NonObjectiveC/*.swift",
"weak_frameworks": "XCTest",
"requires_arc": true,
"pod_target_xcconfig": {
"ENABLE_BITCODE": "NO",
"OTHER_LDFLAGS": "-weak-lswiftXCTest",
"FRAMEWORK_SEARCH_PATHS": "$(inherited) \"$(PLATFORM_DIR)/Developer/Library/Frameworks\""
}
}
CocoaPods 自体のバージョンはどう管理するの?
CocoaPods 自体は RubyGems 上で提供される Ruby ライブラリである。
なので、Ruby のライブラリ管理ツールである Bundler を使う方法が知られている。
要点は以下の3つ。
- Bundler に読ませる設定はルートディレクトリの Gemfile に書く
- Gemfile はこんな風に書く
source "https://rubygems.org"
gem 'cocoapods', '1.0.1'
- Bundler を利かせるためには、pod コマンドを直接使わずに bundler コマンドを咬ませる。
$ bundle exec pod install
どうして最新バージョンが入らないときがあるのか?
pod コマンドはライブラリのメタ情報をローカルにキャッシュする。
あるライブラリの新しいバージョンがリリースされたとしても、このキャッシュが古い情報のままインストールを実行すると、この新しいバージョンが見えない。
自分が担当したトラブルシューティングでは、TravisCI 上で発生していた。
問題の対処法
pod repo update を実行することで、任意のタイミングでキャッシュを更新することが出来る。
リリース済みのバージョンであるにもかかわらず、Podfile 上で指定されたバージョンのライブラリが見つからない、もしくは最新のバージョンが入らない(Podfile 上でバージョンの指定がない場合には、そのライブラリの最新バージョンが取得される)場合には、これによって対処できるかもしれない。