Carthageのcopy-frameworkをスキップして開発時のビルドを高速化する

eureka, Inc.
Eureka Engineering
Published in
5 min readDec 3, 2016

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 + < で開けるので覚えておくと便利です )

screen_shot_2016-11-19_at_15_43_59

Build SchemeのPre-actionsとPost-actionsを編集する

次に SchemeのBuildPre-actionsPost-actions を追加します。

Build時にcopy-frameworksスクリプトをスキップするかどうかのフラグとなるファイルを任意な場所に置くスクリプトを追加します。 本来であれば、Schemeからビルド時の環境変数を設定できれば良いのですが、調べてもわかりませんでした。 もし知っている方が居たら教えていただけると幸いです。

Pre-actions

touch /var/tmp/skip_carthage

Post-actions

rm -rf /var/tmp/skip_carthage
pre-actions
post-actions

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
carthage-script

Scheme完成

これで対応は完了です。

以下の場合は通常のSchemeでビルドを行い、それ以外は copy-frameworks をスキップするSchemeでビルドを行います。

  • クリーンビルドを行なった場合
  • ライブラリを変更した場合 (アップデートも含む)

これでビルド時間を少しだけ早くすることができるので、 変更 -> 確認 のサイクルを高速化できます。

明日は@KeitaroTakeuchiさんの「FalbaTech製ErgoDoxを使ってみた」です!

--

--

eureka, Inc.
Eureka Engineering

Learn more about how Eureka technology and engineering