8月25日にあったRealm meetup #6の時にwantedlyのエンジニア杉上さん@susieyyの発表で「Swiftはコンパイルに時間がかかる、MacBook Pro2台体制で開発をしている」という話がありました。

コンパイルにかかる時間の対策の一つとして「必要なライブラリがCarthageに対応していればCocoaPodsではなくCarthageを使う」と。

CocoaPods自体最近使い始めたばかりでCarthageのことは全然知らなかったんですが、コンパイル時間が短くなるなら試してみようと思い早速使ってみることにしました。

Carthageの使い方

Carthageを使って実際にライブラリを入れるまでの流れを
モバイルデータベースのRealmを例に、新規プロジェクト作成からプロジェクト内でimportするところまでを紹介したいと思います。

Carthageのインストール

Carthage install 20150831 07

https://github.com/Carthage/Carthage

Carthageを使うにはまずパッケージのインストールをします。
https://github.com/Carthage/Carthage/releasesからCarthage.pkgというファイルをダウンロードしてきてインストール。

新規プロジェクト作成

Carthage install 20150831 01

「CarthageRealm」という名前でプロジェクトを作成しました。

ここで1度Xcodeを閉じます。

Cartfile作成

Carthageを使うのに必要な「Cartfile」という名前のファイルをプロジェクトが置いてあるフォルダ内に作成します。

Carthage install 20150831 02

Cartfileの中にはプロジェクトで使うフレームワークを明記します。
今回はRealmなのでこのように書きました。

github "realm/realm-cocoa"

Carthage install 20150831 03

ターミナルで

carthage update

というコマンドを使い、しばらくするとログファイルが吐き出されてたら次に移ります。

Embedded Binariesを追加

Carthage install 20150831 04

今度はXcodeに戻って「RealmをEmbeddedBinaries」にRealmで使うライブラリを追加します。

Carthage install 20150831 05

「cartage update」がうまくいっていれば、プロジェクト配下の「Carthage」の中にRealmのライブラリが追加されています。

RunScriptを追加

Carthage install 20150831 06

App Storeへsubmitするときのバグを回避するために、RunScriptを追加します。

「Build Phases」タブに移動して、タブ内の左上にあるボタンを押して「Run Script」を追加します。

追加されたRun Scriptの内容を書き換えます。

/usr/local/bin/Carthage copy-frameworks

inputFilesにはRealmで使う「Realm.framework」と「RealmSwift.framework」が置いてあるパスを指定します。

$(SRCROOT)/Carthage/Build/iOS/Realm.framework
$(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework

これで設定がすべて終わりました。

import RealmSwift

と書けばRealmがSwiftで使えるようになります。

CocoaPodsからCarthageに変えたらどれくらい早くなるのか?

CocoaPodsとCarthageでどれくらいbuildにかかる時間が違うのか試してみました。

Xcode6.4から「Create a new Xcode project」で新規作成した「Single View Application」を使って

1つはCocoaPodsを使ってRealmを入れたプロジェクト。
もう1つはCarthageを使ってRealmを入れたプロジェクト。

この2つのViewControllerに

import RealmSwift

とだけ追加。
プロジェクトをCleanしてからBuildしてみました。

Carthage install 20150831 08

ビルド中のスクリーンショットでも撮ろうかと思ったら、Carthageの方はスクリーンショットを撮る余裕がないくらいの速さでビルドが完了しました。

一方のCocoaPodsからいれた方は「compiling 18 of 27 source files」とコンパイル中の様子をスクリーンショットにおさめることができました。

さいごに

まだCarthageでは使えないライブラリもあるみたいですが、使えるなら積極的に使っていこうと思います。

参考:シンプルなパッケージ管理ツール Carthage - Realm is a mobile database: a replacement for SQLite & Core Data
[Swift] CocoaPodsとCarthageの違い / ライブラリ管理 - Qiita
https://github.com/Carthage/Carthage/blob/master/README.md
Swift Docs - Realm is a mobile database: a replacement for SQLite & Core Data