iOSアプリの開発を進める中で、Macの空き容量が徐々に減っていることに気づいた。ビルドのたびに、シミュレーターの起動のたびに、何かが積み重なっていく感覚。ゴミ箱を空にしても回復しない。
原因は複数あった。そしていずれも「開発に特有の場所」に溜まっていた。Macに慣れていない、iOSビルドが初めてという人ほど知らずにいる場所だと思うのでまとめておく。
犯人① 最大容量
シミュレーターのデータ。
Xcodeでアプリを動かすたびに使うiOSシミュレーター。古いiOSバージョンのシミュレーターが使わないまま残り続ける。10GB以上になることも珍しくない。Xcode自体が定期的に新しいシミュレーターをインストールするため、気づけば複数世代分が積み重なっている。
シミュレーターの保存場所
~/Library/Developer/CoreSimulator/Devices/
GUIで確認・削除する場合はXcode → Window → Devices and Simulators → シミュレータータブで削除できる。コマンドで一括削除する方が速い。
// 使えない(unavailable)シミュレーターを一括削除
xcrun simctl delete unavailable
「unavailable」は、現在インストールされているXcodeでは使えない古いバージョンのシミュレーターを指す。これだけで数GBから十数GB回収できるケースがある。
犯人②
DerivedData:ビルドのたびに積み重なる。
XcodeはビルドのたびにDerivedDataというディレクトリにキャッシュを生成する。インデックス、ビルド済みオブジェクト、中間ファイル——これらがプロジェクトごとに蓄積する。複数プロジェクトを触っていると、あっという間に5〜20GBを超える。
DerivedDataの場所
~/Library/Developer/Xcode/DerivedData/
GUIで削除する場合:Xcode → Settings → Locations タブ → Derived Data の横の矢印アイコンでフォルダを開き、ゴミ箱へ。
// DerivedDataを丸ごと削除(Xcodeを閉じてから実行)
rm -rf ~/Library/Developer/Xcode/DerivedData/
削除してもXcodeが次回ビルド時に再生成するので問題ない。初回ビルドに少し時間がかかるようになるが、それだけだ。
犯人③
Flutterのビルドキャッシュ。
FlutterプロジェクトはiOSビルド時に大量の中間ファイルを生成する。中でもSwift Package Manager(SPM)が使うSourcePackagesは数百MBになることがある。これはプロジェクトのbuild/ディレクトリ内に格納される。
// Flutterのビルドキャッシュを一括削除(プロジェクトルートで実行)
flutter clean
// SourcePackagesだけ削除したい場合(パスは各自の環境に合わせて変更)
rm -rf [プロジェクトのパス]/build/ios/SourcePackages
flutter cleanはプロジェクト内のbuild/ディレクトリごと削除する。次のビルド時に再生成されるため、問題はない。依存関係が壊れたと感じたときのリセットとしても有効だ。
犯人④
CocoaPodsのキャッシュ。
FlutterはiOSのネイティブ依存をCocoaPodsで管理する。ライブラリをインストールするたびにキャッシュが~/Library/Caches/CocoaPodsに溜まる。バージョンが変わってもキャッシュは残り続けるので、長期間使っていると無視できないサイズになる。
// CocoaPodsキャッシュを全削除
pod cache clean --all rm -rf ~/Library/Caches/CocoaPods
犯人⑤
Xcodeアーカイブ:過去のIPAが残る。
App Storeに提出するためにアーカイブ(.xcarchive)を作成するたびに、~/Library/Developer/Xcode/Archives/に保存される。古いバージョンのアーカイブが何個も残っている場合、それなりのサイズを占める。
Xcode → Window → Organizer → Archives から確認・削除できる。古いバージョンのものは必要なければ削除して問題ない。ただし最新のアーカイブはApp Storeの再提出や差分確認に使う場合があるので、直近のものは残しておいた方が無難だ。
確認方法
どこが何GBか確認する。
Macのストレージ管理はシステム設定からでも確認できるが、ターミナルで直接サイズを見るのが早い。
// 開発者ディレクトリ内の各フォルダサイズを一覧表示
du -sh ~/Library/Developer/*
// Xcodeキャッシュ系もまとめて確認
du -sh ~/Library/Developer/Xcode/DerivedData du -sh ~/Library/Developer/CoreSimulator/Devices du -sh ~/Library/Developer/Xcode/Archives du -sh ~/Library/Caches/CocoaPods
まとめると
iOSビルドを繰り返すと、シミュレーター・DerivedData・Flutterキャッシュ・CocoaPodsキャッシュ・アーカイブの5か所に容量が溜まる。ゴミ箱ではなくこの5か所を定期的に掃除する習慣が必要だ。