Swift用依存管理マネージャのCarthageを導入する

Swift用依存管理マネージャのCarthageを導入する

前回のCocoaPodsは結局採用せずCarthageを採用した理由は以下の通り。

  • 元々のxcodeprojを使えないので、何かあった時に情報が少なそう(Carthageは元のxcodeprojを使うのでシンプル)
  • xcworkspaceについての情報が少ない(Carthageはxcodeprojのまま)
  • AlamofireがCarthageに対応している

Carthageとは?

CocoaPodsと同様に、Cocoaライブラリ依存管理ツールです。下記の2記事が最も詳しく解説されています。

qiita.com

Carthage: Swift対応の新しいライブラリ管理

(ちなみにCarthageとググるカルタゴが出てきますが、チュニジア共和国の古代都市国家だそうで。何故この名前になったのだろう。)

Carthageの仕組み

上記にも言及されていますが、Carthageはdynamic frameworkを作成するとのこと。

一方、CarthageはリポジトリXcodeプロジェクトの情報をそのまま利用してdynamic frameworkを作成します。

dynamic frameworkiOS8以上 対応なのでそれ以下は導入できないらしい。 これ以下のiOSに対応する事はできないので注意が必要。

dynamic frameworkってつまり何?と思ってググると、dynamic library とかstatic library とかがごちゃ混ぜになりつつ、わかってる体で話が進んでいる記事が多いので、 dynamic frameworkとはなんぞや、から探してみると、stackoverflowがヒット。

ios - Library? Static? Dynamic? Or Framework? Project inside another project - Stack Overflow

libraryはコードのみ、frameworkはassetsを含められる。staticはコンパイル時、dynamicはランタイム時ということらしい。static/dynamicはごく普通なので問題なかったですが、framework/libraryの違いがわかってよかった。

Carthageのインストール

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

$ brew update
$ brew install carthage

以上。

Cartfileを作成

BundlerでいうGemfileみたいな感じで依存性をCartfileというファイルに書いていく。

OriginとVersion requirementを追加

Originはgithubリポジトリとして書くか、gitのrepositoryパスを指定する。 Version requirementはバージョン番号のほか、gitのbranch名やcommitのhashを指定できる。

今回は前回のCocoaPodsの時と同様に、Alamofireを導入する。

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

カンタン!

carthage updateを実行

Cartfileに追加したライブラリを実際に利用できるようにする。

$ carthage update
*** Cloning Alamofire
*** Checking out Alamofire at "1.2.2"
*** xcodebuild output can be found in /var/folders/2s/zm_3tqmd2kl9dfk44q55g0s00000gn/T/carthage-xcodebuild.uyO8hk.log
*** Building scheme "Alamofire iOS" in Alamofire.xcworkspace
*** Building scheme "Alamofire OSX" in Alamofire.xcworkspace

carthage updateを叩くとCarthage/Checkoutsディレクトリが作成され、利用するそれぞれのライブラリ名でcloneされる。

$ ls Carthage/Checkouts/Alamofire
Alamofire.playground  Alamofire.xcodeproj   CHANGELOG.md          Carthage              LICENSE               Source                iOS Example.xcodeproj
Alamofire.podspec     Alamofire.xcworkspace CONTRIBUTING.md       Example               README.md             Tests

また、前述したようにdynamic frameworkとしてbuildされる。 ここまで自動でやってくれるので非常に便利。

$ ls Carthage/Build/iOS/Alamofire.framework
Alamofire      Headers        Info.plist     Modules        _CodeSignature

Xcodeに設定を追加

ライブラリを使えるよう、Xcodeでも設定を追加します。

  1. “General” -> “Linked Frameworks and Libraries” から、"+“をクリックし先ほどビルドしたCarthage/Build/iOS/Alamofir.frameworkを追加
  2. “Build Phases” -> “+” -> “New Run Script Phase” から、Scriptとして下記を追加
/usr/local/bin/carthage copy-frameworks

これだけでうごく!と思いきやエラーが。 同じエラーが出ている人もいるようで見てみる。

どうも皆 “General” -> “Embedded Binaries"にも追加しているので、やってみると成功した。 これでswfitから

import Alamofire

とすれば利用できます。

まとめ

  • CocoaPodsに比べると導入がちょっと手間がかかるけど、管理とかハマりを考えたら楽だと思う。
  • Carthageカンタン便利!対応しているならどんどん使っていくと良いと思う。
  • CarthageのついでにReactiveCocoaとか面白そうだけど、しょっぱなからこれはどうだろうという思いと、趣味だしいいんじゃねーの感の葛藤がある