SpotifyはXcodeのコンパイル時間を短縮するためにXCRemoteCacheを開発した。最近オープンソース化されたXCRemoteCacheは、クリーンビルド時間を70%短縮できるとSpotifyは言っている。
名前が示すように、このライブラリはiOSプロジェクト向けのリモートキャッシング実装です。継続的インテグレーション(CI)マシンで生成されたXcodeターゲットアーティファクトを再利用することを目的としています。
リモートビルドキャッシュの背景にある考え方は、ローカルでビルドするのではなく、他のマシンで共有されるコンパイル済みのアーティファクトをダウンロードすることである。Spotifyの場合、特にリモートブランチをリベースまたはマージした後、メインのSpotifyアプリのビルドに最大10分かかることがある。これはリモートキャッシュの理想的なケースであるとSpotifyは言っている。
XCRemoteCacheは、フィンガープリントを使って、再利用できるビルド製品を識別する。すべての依存関係を明示的にリストアップすることなく、コンパイルユニットに対するすべての入力ファイルを識別するXcodeの方法があれば、XCRemoteCacheは、特定のビルドに入力されたファイルを識別するために、ビルド時に生成されたメタデータを利用できる。これらのメタデータは、対応するコミットIDに関連付けられ、フィンガープリントを作成する。フィンガープリントは、ビルド済みのアーティファクトを識別するために使用され、後で別のビルドに利用できる。
XCRemoteCacheによるパフォーマンスの向上を測定するために、Spotifyは、開発者の50%に1週間使用させ、その結果を残りの開発者と比較するという実験を行った。
結果は予想を上回るものでした。ローカルビルド時間の大幅な改善が見られました。クリーンビルドの中央値と増分ビルド時間は、それぞれ70%、6%減少した。すべてのターゲットの少なくとも50%が少なくとも1つのファイルをコンパイルする場合、ビルドをクリーンとして分類します。少なくとも1つのファイルをコンパイルする他のビルドはインクリメンタルとします。
SpotifyはXCRemoteCacheを1年以上使っている。開発者から肯定的なフィードバックを報告している。
XCRemoteCacheのプロジェクトへの統合を成功させるために重要な側面の1つは、XCRemoteCacheを複数のターゲットに分割することだ。それぞれのターゲットをキャッシングユニットとして使用する。キャッシングユニットは大きすぎたり断片化しすぎたりしないようにする必要がある。ローカルビルドの最小化を保証し、頻繁なキャッシュの無効化を回避するためだ。
XCRemoteCacheは、CocoaPodsプラグインを使ってXcodeプロジェクトに簡単に統合できる。Amazon S3やGoogleのGoogle Cloud Storageなど、PUT、HEAD、GETリクエストをサポートするHTTPサーバが必要となる。XCRemoteCacheは、CocoaPods、Carthage、あるいは、他の依存関係マネージャーを使うプロジェクトと互換性がある。