Carthageの使い方を体系的に理解する

Carthageの使い方を体系的に理解する

Table of Contents

ライブラリ管理ツールとして市民権を得て暫く経つCarthageですが、
次のケースに該当する方もいると思います。

はじめに

対象読者

  • 使う機会がなかった人
  • 個人利用はあるが会社ではまだの人
  • iOS/Swiftに入門したての人

記事の内容

Carthageの基礎から利用、そして運用など、
実務で必要な知識を体系的に説明します。

  • 基本情報
  • 導入手順
  • git管理について
  • デバッグ環境
  • ライブラリのバージョン制御
  • ライブラリの更新
  • テスト用ライブラリ
  • 新しいバージョンを確認する
  • GitHub以外のライブラリ

記事の読み方

1記事に収まらないボリュームのため、複数の記事に分けてます。
分けた記事はこの記事からリンクで追跡できます。合わせてお読みください。

注意点

この記事の内容は、主に実務から得た知見ベースです。
iOSアプリに主軸を置いて説明しています。

Carthageの基本情報

  • Carthageとは何か?
  • なぜCocoaPodsと比較されるのか?
  • メリットとデメリットは何か?

CocoaPodsとの違いで方針を知りましょう。

Carthageの読み方

Wikipediaだとカーセージカルタゴの2つあります。
作者の出身や公式ロゴ背景から考えてカルタゴな気がしますが、
呼びやすい方でいいと思います。

Carthageとは?

Swift製のCocoa用ライブラリ管理ツールです。

機能は大きく2つです

  • ライブラリ毎の.frameworkを作成と更新
  • ビルド時の.frameworkコピーをサポート

なお、プロジェクトへの追加は手動です。

CarthageとCocoaPodsの違い

2つの違いは「手軽」と「柔軟」です。
簡単に説明します。

CocoaPodsは使いやすさ重視

  • Xcodeワークスペースを自動作成・更新
  • ライブラリのビルドからリンクまで統合

Carthageは柔軟性と独立性を重視

  • フレームワークをビルド
  • Xcodeプロジェクト操作をしない
  • ライブラリのリンクはしない

Carthageのメリットとデメリット

  • メリット
    • CocoaPodsよりビルド時間が短い
    • Xcodeの仕様変更に影響されにくい
  • デメリット
    • CocoaPodsより対応ライブラリが少ない
    • CocoaPodsより導入とフレームワーク管理が面倒

CocoaPodsより対応ライブラリが少ない

CocoaPodsと比べると、対応ライブラリは多く印象です。
使用ライブラリがCocoaPodsしか対応していないことはよく目の当たりにします。

CocoaPodsよりビルド時間が短い

測定結果によると、CarthageはCocoaPodsよりビルド時間が半分近く短いです。

詳細と残りのメリット・デメリットは「CarthageとCocoaPodsの違いを経験交えて比較する 」にまとめてあります。

Carthageの導入手順

CarthageのMacへのインストールも含めると大きく4手順になります。

  1. HomebrewでCarthageインストール
  2. Podfile作成と編集
  3. Podfileからframework作成
  4. frameworkリンキングとコピー

これら手順毎に説明すると記事ボリュームが大きくて読みにくいので
別記事として「iOSのCarthage導入手順と注意点 」にまとめてます。

Carthageのgit管理について

carthage updateが生成したデータは、全てをgit管理する必要はありません。
git管理下には別PCでも環境再現ができればいいのですから、
最低限で言えばCartfile.resolvedだけで環境の再現は可能です。
しかしそれだと大抵はCIで困ることが起きます。
詳細は「Carthage bootstrapとGit管理をチーム運用観点で整理 」にまとめてます。

Carthageのデバッグ環境について

fromeworkをDebug Configurationでビルドする必要があります。

Xcodeでは他環境で作成されたframeworkをステップ実行できません。 またビルドConfigurationがReleaseだとコンパイラがコード最適化することでコードと実際のステップ数に違いが起きたり変数が使えなくなります。 ライブラリによってはGitHubなどに既にビルド済みのフレームワークが用意されており、
Carthageは特に指定がなければそれを使ってインストールして時間短縮を行っています。 しかし大抵はRelease Configurationでビルドされているため、ステップ実行はできません。

手元でかつDebug Configurationでビルドすればステップ実行できるようになります。
Build Configurationを指定するには、–configuration オプションを使います。

$ carthge update --platform iOS --no-use-binaries --configuration Debug

updateではなくともbootstrapでも大丈夫です。

またBuild ConfigirationがReleaseなどでコード最適化されている場合は、ステップ実行すると次のログがコンソールに表示されます。

SwiftyJSON was compiled with optimization - stepping may behave oddly; variables may not be available.

Carthage管理下ライブラリのバージョン制御について

ライブラリを導入すればバージョン制御が必要になります。
Carthageでライブラリを導入してる場合の新規登録時や更新時などのバージョン制御があります。

例えば次のようなCartfileでバージョンを指定することが出来ます。

github "SwiftyJSON" ~> 4.2.0

詳しくは「CarthageのCartfileの書き方と個別更新方法 」にまとめてあります。

Carthage管理下のライブラリの個別更新

ライブラリが更新されたらCarthageにはライブラリを更新するコマンドが用意されています。
例えば次のシェルはこのような意味になります。

  • SwiftJSONAPIKitを更新
  • GitHubなどにアップロード済みのzipなどを使わず、コードから
  • iOSプラットフォームだけを対象
$ carthage update SwiftyJSON APIKit --platform iOS --no-use-binaries

--platform iOSはiOSアプリでしか使わないのであれば他プラットフォーム用ビルドをしても意味ないので、
その場合はこのオプションをつけます。

--no-use-binariesはGitHubにビルド済みがアップロードされてる場合はそれを使おうとするので、
それを使わずコードからビルドしたい場合はこのオプションをつけます。
バイナリ使ったほうが更新処理は早いのですが、
もしアップロードされてるSwiftバージョンが異なったりするとエラーとなるので、
そこが気になるならこのオプションをつけといたほうがいいです。
少し時間がかかるぐらいなので。

Carthageにテスト用ライブラリをインストールする方法

テストでしか使用しないフレームワークはCartfileではなく
Cartfile.privateファイルを用意して、インストールします。

$ touch Cartfile.private

中身の書き方は通常のCartfileと変わりません。
注意点としては、プロジェクトへのリンク設定で、ターゲットをテストに対して行うことを忘れずに。

新しいバージョンを確認する

開発ではライブラリを使っていると新しいバージョンがリリースされたら追従させる必要があります。 Carthageで管理してるライブラリに新しいバージョンがリリースされているかどうかを調べる方法があります。 carthage outdatedコマンドを実行すると一覧で確認することができます。

例えばSwiftyJSONに新しいバージョンが出てる場合です。

$ carthage outdated
*** Fetching SwiftyJSON
The following dependencies are outdated:
SwiftyJSON "4.3.0" -> "4.3.0" (Latest: "5.0.0")

CarthageでGitHub以外のライブラリを使う方法

大半のライブラリはGitHubにあるとは思いますが、全てのライブラリではありません。
例えば社内限定であれば自社内にOSSのGitレポジトリがありますし、GitLabやGitBucketもあります。
その場合はCartfileに次の書き方でそれぞれのライブラリをインストールできるようになります。

github "https://enterprise.local/hoge/fuga/perfect-library" # GitHub Enterprise
git "https://enterprise.local/hoge/fuga/perfect-me.git" # Other Git repositories

まとめ

他にも色々な機能や仕様を含んでおりますが、全部紹介せずとも実務で使う分には十分なボリュームになっているかと思います。

当然ながら、公式には記載がされているので暇があったら少しずつ追うのもいいかもしれません。
README.mdだけでなくDocumentationもあるので見落とさず。

今後もCarthage自体がシンプルなままで、対応ライブラリが増えるといいですね。

このエントリーをはてなブックマークに追加