環境: Xcode 7.0.1
Swift2.0
Carthage(カーセージって読むみたい)というライブラリ管理ツールを使ってみた。
CocoaPods と比べると
・CocoaPods では Static Library のlibPods.a
を静的リンクしていたが 、Carthage はxcodebuild
コマンドを使ってビルドした Dynamic Framework (iOS8以降)を実行時に動的にリンクする
・CocoaPods のように.xcworkspace
のようなスキームは生成されない、ライブラリは自分でプロジェクトに追加しなければならないが.xcodeproj
のまま扱える
・ビルドが早い
などの違いがあるらしい。
インストール
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
watchOS
、OSX
、iOS
各プラットホーム分作成された。
iOS のみでよければ--platform
で指定すればよい。
$ carthage update --platform iOS
コマンド実行後は以下のようなディレクトリ構成となった。
Xcode に framework を追加
作成された framework を Xcode のTarget > General > Linked Frameworks and Binaries
に追加する。
+ ボタンから追加するか Finder からドラッグ&ドロップでも追加できる。
ライブラリを使う
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
にも追加するらしい。
これでエラーは解消された。
むしろはじめから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
を入力。