xyk blog

最近は iOS 開発の記事が多めです。

Carthage を使ってライブラリを管理する

環境: Xcode 7.0.1
Swift2.0

Carthage(カーセージって読むみたい)というライブラリ管理ツールを使ってみた。
CocoaPods と比べると
・CocoaPods では Static Library のlibPods.aを静的リンクしていたが 、Carthage はxcodebuildコマンドを使ってビルドした Dynamic Framework (iOS8以降)を実行時に動的にリンクする
・CocoaPods のように.xcworkspaceのようなスキームは生成されない、ライブラリは自分でプロジェクトに追加しなければならないが.xcodeprojのまま扱える
・ビルドが早い
などの違いがあるらしい。

github.com

realm.io

インストール

homebrew でインストールできる。

$ brew update
$ brew install carthage

確認

$ carthage version
0.8.0

Cartfile 作成

Cartfileというファイルを作成して、使用したいライブラリを記述していく。
GitHub レポジトリversion を指定する。

$ cat Cartfile
github "Alamofire/Alamofire" >= 3.0.0

carthage update コマンド実行

依存関係があればそれも含めてダウンロードし、そしてビルド& framework を行う。

$ carthage update
*** Fetching Alamofire
*** Checking out Alamofire at "3.0.0"
*** xcodebuild output can be found in /var/folders/ml/2hwc26zx5b30jf3k4tp_kzj00000gn/T/carthage-xcodebuild.h6xNwA.log
*** Building scheme "Alamofire watchOS" in Alamofire.xcworkspace
*** Building scheme "Alamofire OSX" in Alamofire.xcworkspace
*** Building scheme "Alamofire iOS" in Alamofire.xcworkspace

watchOSOSXiOS各プラットホーム分作成された。
iOS のみでよければ--platformで指定すればよい。

$ carthage update --platform iOS

コマンド実行後は以下のようなディレクトリ構成となった。

f:id:xyk:20151011104005p:plain

Xcode に framework を追加

作成された framework を XcodeTarget > General > Linked Frameworks and Binariesに追加する。
+ ボタンから追加するか Finder からドラッグ&ドロップでも追加できる。

f:id:xyk:20151011104033p:plain

ライブラリを使う

import Alamofire

早速 import して実行してみたところ、ビルドは成功するがシミュレータ起動直後に以下のエラーが発生した。

dyld: Library not loaded: @rpath/Alamofire.framework/Alamofire
  Referenced from: /Users/xyk/Library/Developer/CoreSimulator/Devices/B9D56604-82C8-4752-A4D8-51292D8F625A/data/Containers/Bundle/Application/304560B9-432C-4A5D-BCEF-B2328D84DED1/AlamofireSample.app/AlamofireSample
  Reason: image not found

ググってみるとTarget > General > Embedded Binariesにも追加するらしい。

f:id:xyk:20151011111502p:plain

これでエラーは解消された。

むしろはじめからEmbedded Binariesの方に追加するほうがよいかも。Linked Frameworks and Binariesにも同時に追加されるし。

ライブラリを使う分にはここまでの手順で OK だが、アプリを AppStore にサブミットするためには、さらに以下のワークアラウンドを行う必要があるらしい。

Script の追加

Build Phasesの + ボタンをクリックしNew Run Script Phaseを選択し

/usr/local/bin/carthage copy-frameworks

を入力。またInput Files

$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework

を入力。

f:id:xyk:20151011114007p:plain

f:id:xyk:20151011114317p:plain