はじめに
BitriseでiOSアプリのビルドを実行した時に、Build Phasesで行われるCocoaPodsのチェックで以下のようなエラーとなるケースがありました。結論としてはBitriseのキャッシュの影響でしたが、そのエラーとなるケースと解決策についてまとめます。
error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
前提条件
このエラーが起きるのに関係していた前提条件はこちら。
- パッケージマネージャーにCocoaPodsとCarthateを併用している
- CocoaPodsの成果物であるPodsディレクトリもGit管理対象にしている
- Carthageの成果物であるCarthageディレクトリはGit管理対象外にしている
- Carthageの成果物をキャッシュするために Bitrise.io Cache Pull/Push ステップを使用している
- キャッシュ対象としてCarthageディレクトリのみを明示
なぜエラーになったのか
特に指定はしていないのですが 暗黙的にPodsディレクトリがキャッシュ対象 になっていました。つまり、Git管理下にあるPodsディレクトリはキャッシュにより上書きされてしまうことになり、Pods/Manifest.lockが前回実行時のものとなってしまうのです。結果、CocoaPodsのライブラリを更新したプッシュの後に、最初に書いたとおりのエラー(Podfile.lockとManigest.lockが一致しない)になっていたのでした。
解決策
Bitrise.io Cache Push ステップの bitrise_cache_exclude_paths にPodsディレクトリパスを指定してキャッシュ対象にならないようにしましょう。
bitrise_cache_exclude_pathsのデフォルト値は $BITRISE_CACHE_EXCLUDE_PATHS
になっているので、Env Vars に BITRISE_CACHE_EXCLUDE_PATHS を定義してPodsディレクトリのパスを指しておけば、すべてのワークフローで有効になりますね。