Carthageのcopy-frameworkをスキップして開発時のビルドを高速化する
iOSエンジニアのmuukiiです。
この記事はEureka Advent Calendar 2016 3日目の記事です。
2日目は川端さんのshader入門 -CIKernelでカスタムフィルター作成-でした。
今回はライブラリ管理にCarthageを利用している環境で開発時のビルド作業を効率化をするTipsを紹介します。
CarthageはCocoaPodsと違い事前にframeworkを作ってしまうため、 Xcodeのビルド時にはframeworkのビルド時間を省略することができます。
Carthageを使う場合、正しくframeworkをアプリにインストールするためにBuild Phaseで copy-frameworks
を実行する必要があります。 copy-frameworks
はframeworkをアプリにインストールする処理を行いますが、不要なアーキテクチャのバイナリを削除してからコピーを行うため少し時間がかかります。 この処理はライブラリの数に合わせて処理時間も増えてきますが、これは開発時であれば必ず必要な処理というわけではありません。
Xcodeでビルドを行うと成果物は Derived Data
にキャッシュとして残ります。 そしてアプリをインストールする際には Derived Data
からコピーされます。 つまり、Derived Dataに正しくframeworkがインストールされていれば copy-frameworks
を行わなくてもアプリは実行可能です。
細かい変更を確認する時にビルド時間を少しでも早くしたかったので、 frameworkがインストール済みと分かっている時には copy-frameworks
をスキップさせるSchemeを作りました。
開発時にいつも使用しているBuild Schemeを複製する
開発時に使用しているSchemeの設定画面を開きSchemeを複製します。
( Cmd + Shift + < で開けるので覚えておくと便利です )
Build SchemeのPre-actionsとPost-actionsを編集する
次に SchemeのBuild に Pre-actions と Post-actions を追加します。
Build時にcopy-frameworksスクリプトをスキップするかどうかのフラグとなるファイルを任意な場所に置くスクリプトを追加します。 本来であれば、Schemeからビルド時の環境変数を設定できれば良いのですが、調べてもわかりませんでした。 もし知っている方が居たら教えていただけると幸いです。
Pre-actions
touch /var/tmp/skip_carthage
Post-actions
rm -rf /var/tmp/skip_carthage
TargetのBuild Phaseで実行しているcopy-frameworksスクリプトを編集する
最後にBuild PhaseのCarthageの部分を編集します。
通常は以下のようなスクリプトになっていると思います。
/usr/local/bin/carthage copy-frameworks
こちらを以下のように書き換えます。
Schemeで作成したファイルが存在していたら copy-frameworks
を実行しないようにします。
if [ ! -e /var/tmp/skip_carthage ]; then
/usr/local/bin/carthage copy-frameworks
fi
Scheme完成
これで対応は完了です。
以下の場合は通常のSchemeでビルドを行い、それ以外は copy-frameworks
をスキップするSchemeでビルドを行います。
- クリーンビルドを行なった場合
- ライブラリを変更した場合 (アップデートも含む)
これでビルド時間を少しだけ早くすることができるので、 変更 -> 確認 のサイクルを高速化できます。
明日は@KeitaroTakeuchiさんの「FalbaTech製ErgoDoxを使ってみた」です!