[Xcode][小ネタ] DerivedDataの削除についての備忘録

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

モバイルアプリサービス部の中安です。

本日は自分のための備忘録ネタです。

iOSアプリの開発をしていると、たまにXcodeがおかしくなり、どうにもこうにもよく分からないエラーを吐き出し始めた時、 試しに DerivedData を削除してみるということをよくします。

DerivedData は、プロジェクトごとに生成されるキャッシュデータといいますか、インデックスやログや生成物の等の溜め場といいますか、中間データの類です。 ときにこれが悪さをして不穏な動きをさせてしまっていることもあるようです。

実際、開発時はこれを削除してXcodeを再起動すると、Xcodeの不安定動作やエラーが消えるということもよくあります。

その1. Clean Build Folder

Xcodeにはビルドフォルダのクリーン機能があります。 しかし、いつも自分は方法を忘れてググってしまいます。 本当に簡単な操作なのですが、ここに書いて忘れないようにします。

上部メニュー > [Product] でメニューを出す

step1

キーボードの option を押しっぱなしにすると、[Clean] の項目が [Clean Build Folder...] に変わるので押下

step2

ダイアログで確認されるので [Clean] を押下

step3

これでダイアログで尋ねられたとおり、 DerivedData の中の ビルドデータ等々の中間データが削除されます。

その2. まるごと消す

前項の操作では DerivedData のうちの一部を削除するだけに留まります。 Clean Build Folder をしてみてもなお、うまく動かないときは丸ごと消してみる手もあります。

Xcodeが次回ビルド時にまた自動で生成するものなので、 次回ビルドに時間がかかってしまいますが、消すこと自体で影響は発生しません。

以前は Xcode自体に丸ごと消すような仕組みが Organizer にあったのですが、最近の Xcode は見当たりません(またいつか仕様が変わるかもしれませんが)。 代わりにその置き場所がすぐわかる仕組みがあります。

これもまた、いつも自分は方法を忘れてググってしまいます。 本当に簡単な操作なのですが、ここに書いて忘れないようにします。

上部メニュー > [File] > [Workspace Settings…]

スクリーンショット 2017-10-31 20.00.34.png 2017-10-31 20-01-37

Derived Data: の下にパスが書いてあるところに矢印があるので押下

スクリーンショット 2017-10-31 20.00.41.png 2017-10-31 20-03-05

Finderが表示されるので、プロジェクト名から始まるディレクトリを手動で消す

これで丸ごと消せたので、Xcode再起動後したり、クリーンビルドなどをしてみると解決したりすことがあります。

ディレクトリごと消す

先ほども書いたとおり、DerivedData は消しても影響のないものなので、 ディスクスペース節約の意味も込めて他のプロジェクトのもまとめて消すこともあります。 (多くのプロジェクトを掃除しないままにしていると、思わぬディスク容量の圧迫にあったりします)

先ほどの方法で Finder から消す方法でもいいと思いますが、ターミナルから簡単に消せるようにしておくのもアリかなと思います(好みですが)。

DerivedData は特に変更がなければ以下の場所に作られます。

~/Library/Developer/Xcode/DerivedData

なので、

$ rm -rf ~/Library/Developer/Xcode/DerivedData/*

ってやってやります。

ただ、rm -rf 打ち間違えたら大惨事なので、コマンドはエイリアスにしておきたいところです。

$ vi ~/.bash_profile 
# .bash_profile内
alias derived='rm -rf ~/Library/Developer/Xcode/DerivedData/*'

今回「derived」コマンドとしていますが、名前は自由なので適宜書き換えてもらって

$ derived

これでターミナルからさくっと DerivedData を全クリアできるようになりました。

最後に

今回は備忘録のため、人によってやり方が違うような気がします。

自分と同じような忘れんぼの方のお役に立てればと思います。

以上です。