読者です 読者をやめる 読者になる 読者になる

Swiftのライブラリ管理ツール『Carthage』

プログラミング

転職してから少しiOSアプリ開発から遠ざかっていたのですが、その間にSwiftに対応した新しいライブラリ管理ツールCarthageが出ていました。
Objective-Cの時から有名なライブラリ管理ツールのCocoaPodsも昨年末にSwiftの対応が行われたようですが、一度Carthageも試してみます。

Carthage

インストール

brewを使ってインストールできます。
インストール用のpkgが用意されているほか、Githubのソースからコンパイルすることも可能なようです。

まずはbrewのアップデート

$ brew update

完了したらインストールコマンドを実行

$ brew install carthage

完了したらバージョンを確認

$ carthage version

インストールした時点のバージョンは0.6.2

ライブラリの追加

JakeLin/SwiftWeatherでライブラリの追加方法を確認します。

まずはSwiftWeatherをクローン。
クローンできたら、プロジェクトファイルと同じディレクトリのCartfileを確認。
Carthageでは利用するライブラリをCartfileで管理します。

github "SwiftyJSON/SwiftyJSON"
github "ishkawa/Alamofire"

SwiftWeatherはSwiftyJSONとAlamofireを利用しています。Carthageを使って、この2つのライブラリをインストールします。
Cartfileがあるディレクトリに移動し、以下のコマンドを実行。

carthage update

としたのですが、

DVTAssertions: Warning in /SourceCache/IDEXcode3ProjectSupport/IDEXcode3ProjectSupport-6269/Xcode3Core/LegacyProjects/Frameworks/DevToolsCore/DevToolsCore/SpecificationTypes/BuiltInSpecifications/Compilers/XCGccMakefileDependencies.m:77

からはじまるエラーメッセージが表示されてうまくインストールできませんでした。
プロジェクトを新規で作成してCartfileを作成しても同じエラーが…。
何気なくiOS Simulatorでアプリを起動してみようとすると、「Unable to determine device.」のポップアップが。
どうもTimeMachineで復旧すると、このような状況になるよう。
XcodeのWidnow > Devicesからデバイスを追加。
Simulatorの起動を確認して、再度carthage updateを行うと無事にライブラリのインストールができました。

CarthageはGithubソースコードをCarthage/Checkoutsディレクトリにクローンし、ライブラリの設定に従ってCarthage/Buildにframeworkをビルドするよう。
なお、Carthage 0.4からディレクトリの構成が現在のように変わったようです。
SwiftWeatherはそれ以前の構成を前提にframeworkの場所が指定されているため、修正が必要です。

"General"の"Linked Frameworks and Libraries"に、ビルドされたフレームワークを追加します。 SwiftWeatherの場合は、Swift Weather Instant、SwiftWeatherSerivceにも追加が必要です。

続いて、アプリの"Build Phases"タブの左上の「+」から"New Run Script Phase"を追加。
以下の内容を記載し、

/usr/local/bin/carthage copy-frameworks

Input Filesに以下を追加。

$(SRCROOT)/Carthage/Build/iOS/AlamoFire.framework
$(SRCROOT)/Carthage/Build/iOS/SwiftyJSON.framework

以上で無事、Simulatorと実機でSwiftWeatherを動かすことができました。

iOS Simulatorのデバイスがなくてビルドエラーが発生したところが、情報もなくて戸惑いました。。

CocoaPodsのように設定済みのWorkspaceが生成されないので、自分で依存関係の設定が必要だけれどシンプルだからビルドセッテイングとかではハマることは少なくなりそう。
対応しているライブラリはまだCocoaPodsの方が多いですが、有名なライブラリはだいぶ対応しているようなのでそこまで困らないかも。