8月25日にあったRealm meetup #6の時にwantedlyのエンジニア杉上さん@susieyyの発表で「Swiftはコンパイルに時間がかかる、MacBook Pro2台体制で開発をしている」という話がありました。
コンパイルにかかる時間の対策の一つとして「必要なライブラリがCarthageに対応していればCocoaPodsではなくCarthageを使う」と。
CocoaPods自体最近使い始めたばかりでCarthageのことは全然知らなかったんですが、コンパイル時間が短くなるなら試してみようと思い早速使ってみることにしました。
Carthageの使い方
Carthageを使って実際にライブラリを入れるまでの流れを
モバイルデータベースのRealmを例に、新規プロジェクト作成からプロジェクト内でimportするところまでを紹介したいと思います。
Carthageのインストール
https://github.com/Carthage/Carthage
Carthageを使うにはまずパッケージのインストールをします。
https://github.com/Carthage/Carthage/releasesからCarthage.pkgというファイルをダウンロードしてきてインストール。
新規プロジェクト作成
「CarthageRealm」という名前でプロジェクトを作成しました。
ここで1度Xcodeを閉じます。
Cartfile作成
Carthageを使うのに必要な「Cartfile」という名前のファイルをプロジェクトが置いてあるフォルダ内に作成します。
Cartfileの中にはプロジェクトで使うフレームワークを明記します。
今回はRealmなのでこのように書きました。
github "realm/realm-cocoa"
ターミナルで
carthage update
というコマンドを使い、しばらくするとログファイルが吐き出されてたら次に移ります。
Embedded Binariesを追加
今度はXcodeに戻って「RealmをEmbeddedBinaries」にRealmで使うライブラリを追加します。
「cartage update」がうまくいっていれば、プロジェクト配下の「Carthage」の中にRealmのライブラリが追加されています。
RunScriptを追加
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の方はスクリーンショットを撮る余裕がないくらいの速さでビルドが完了しました。
一方の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