Cocoaのライブラリ管理ツール「Carthage」のセットアップ&操作方法


「Carthage」とは?

Cocoa(iOSやmacOSなど)のライブラリ管理ツールです。
「カーセッジ」または「カルタゴ」と読みます。
どちらの読みが正しいのかはわかりません。。

CocoaPodsとの主な違い

Cocoaのライブラリ管理ツールといえば「CocoaPods」という有名なツールがあります。
主な違いは以下の2点です。

  • 事前にライブラリをビルドする
    そのため、1回あたりのビルド時間が延びない
  • .xcworkspace ファイルが生成されない
    .xcodeproj ファイルのままプロジェクトを扱える

1回あたりのビルド時間が延びないのは大きなメリットであり、それが理由でCocoaPodsから乗り換える方も多いと思います。

Cocoaのライブラリ管理ツール一覧

Cocoaのライブラリ管理ツールを表にまとめると以下の通りです。

名前 ライブラリのインストール時間 1回のビルド時間
CocoaPods 速い 遅い
Carthage 遅い 速い
SwiftPM 速い 遅い

「SwiftPM」とは「Swift Package Manager」の略であり、Apple公式のライブラリ管理ツールです。
https://github.com/apple/swift-package-manager

環境

  • OS:macOS Mojave 10.14
  • Xcode:10.0 (10A255)
  • Swift:4.2
  • Carthage:0.31.2

Carthageのセットアップ

Carthageのインストール

Homebrewからインストールします。

$ brew install carthage

Carthage自体のセットアップはこれだけです。
設定なども不要です。

ライブラリのセットアップ

ライブラリのセットアップは手順が多いので、漏れがないように注意する必要があります。

カレントフォルダの変更

まずはプロジェクトのルートフォルダに移動します。

$ cd {.xcodeprojファイルがあるフォルダ}

Cartfileの編集

プロジェクトのルートフォルダに Cartfile という拡張子なしのファイルを作成し、使いたいライブラリを記述します。

Cartfileのフォーマットは以下の通りです。

Cartfile
github "{作者名/リポジトリ名}" {記号} {バージョン}

記号の意味は以下の通りです。

記号 意味
>= 1.0 1.0以降の最新バージョン
~> 1.0 1.0と互換性がある最新バージョン
== 1.0 1.0と一致するバージョン
なし 最新バージョン

GitHub以外にあるライブラリも使えますが、あまり使わないと思うのでここでは割愛します。

例:
Realm(NoSQLのDB)をインストールします。
2018/12/16現在の最新バージョンが 3.13.0 なので、それと互換性のあるバージョンを指定します。

Cartfile
github "realm/realm-cocoa" ~> 3.13.0

ライブラリのビルド

Xcodeを終了し、以下のコマンドを実行します。

$ carthage update --platform iOS

Cartfile に記述した全てのライブラリにおいて、ソースコードがダウンロードされ、ビルドが始まります。
ライブラリによっては ダウンロードやビルドに時間がかかります

--platform でプラットフォームを指定しないと、macOSやwatchOS用のビルドも行ってさらに時間がかかるため、指定すべきです。

ビルドが完了すると Cartfile.resolved というファイルが生成されます。
こちらのファイルには実際にダウンロードしたライブラリのバージョンが記述されています。

例:

Cartfile.resolved
github "realm/realm-cocoa" "v3.13.0"

Realmの v3.13.0 がダウンロードされたことがわかります。

ちなみに、ライブラリ名を指定することで、対象のライブラリのみビルドすることもできます。

$ carthage update {ライブラリ名} --platform iOS

例:

$ carthage update realm-cocoa --platform iOS

ライブラリのビルド(既存のプロジェクト)

既存のプロジェクトの場合、開発者同士でライブラリのバージョンを合わせる必要があると思います。
その場合、carthage update の代わりに carthage bootstrap を実行すれば Cartfile.resolved に記述されているバージョンをインストールします。

$ carthage bootstrap --platform iOS

そのため、 CartfileCartfile.resolved はバージョン管理に含めるべきです。

ビルドの確認

ライブラリのビルドに成功すると、 Carthage/Build/iOS/ フォルダに {ライブラリ名}.framework ファイルが生成されます。
生成されていない場合、ビルドに失敗している可能性があるため、 carthage update 時の出力を確認してください。

例:
Realmの場合、 RealmSwift.frameworkRealm.framework の2つがビルドされます。

ライブラリを製品ターゲットに追加

以下の手順でビルドしたライブラリをプロジェクトに追加します。

Xcodeでプロジェクトを開く
TARGETSで製品ターゲットを選択 > General - Linked Frameworks and Librariesに .framework をドラッグ&ドロップする

例:
Realmの場合、2つともプロジェクトに追加します。

Build Phases > +をクリック > New Run Script Phase
以下のスクリプトを記述します。

/usr/local/bin/carthage copy-frameworks

Input Files > +をクリック
ライブラリのパスを相対パスで記述します。

$(SRCROOT)/Carthage/Build/iOS/{ライブラリ名}.framework

ライブラリをテストターゲットに追加

ライブラリを単体テストで使う場合、テストターゲットにも追加する必要があります。

TARGETSでテストターゲットを選択 > Build Settings - Framework Search Paths
以下を記述します。

$(PROJECT_DIR)/Carthage/Build/iOS

こちらを記述しないと単体テストの実行時に以下のビルドエラーが発生します。

No such module '{ライブラリ名}'

単体テスト時の注意

Target Membershipにテストターゲットを含めるとテストできないことがあるため、製品ターゲットのファイルのチェックはOFFにします。

単体テストを書くときは @testable import {製品ターゲット名} でインポートすることでテストできます。

追加したライブラリも import {ライブラリ名} でインポートする必要があります。

例:

importせずに呼び出そうとすると、以下のビルドエラーが発生します。

Use of undeclared type '{ライブラリ名}'

バージョン管理から無視する

ビルドしたライブラリはサイズが大きいため、 Carthage フォルダごとバージョン管理の対象外にすべきです。

Gitを使っている場合、以下を .gitignore に追加するのみでOKです。

.gitignore
Carthage

ライブラリの削除

こちらの記事でわかりやすく説明されていたので、本記事では割愛します。
https://qiita.com/y-some/items/85c2606928b0f1ef5d72

おわりに

これでライブラリが使えるようになります!
OSSのライブラリはうまく活用することで開発のコストや品質を大幅に上げることができるため、Carthageを使って素晴らしいライブラリライフを送りましょう

参考リンク