以下のTwitterアンケートを見かけたので、記事書いてみました。
結果は、母数が10人なので参考程度にするのが良いと思いますが、僕も多数派の「CocoaPodsもCarthageも含めている」を特に迷い無く選択しています僕は今ではCocoaPodsもCarthageも含めていない運用にしています。
【iOSアプリプログラマに質問】
— りず (r.izumita) (@rizumita) October 6, 2016
あなたはアプリのリポジトリにCocoaPodsで取得したソースコードやCarthageでビルドしたフレームワークを含めていますか?
ちょうどCocoaPodsのガイドにこのことが記載されているので、まずはその訳を載せます。
(この記載はわりと有名なはずで、ここでオススメされているからバージョン管理に含める選択を取っている人も多そう。)
CocoaPodsのガイドの訳
Podsディレクトリはバージョン管理に含めるべきか?
Pods
フォルダをバージョン管理に含めるべきかどうかはあなた次第です。最適なワークフローはプロジェクトごとに異なります。
ただ、Pods
フォルダを.gitignore
に追加せずにバージョン管理に含める方式をオススメします。
とはいえ、どっちを選ぶかはお任せします。
バージョン管理に含める利点
- リポジトリをクローン後、プロジェクトをすぐにビルド・実行出来る状態になる
- CocoaPodsがインストールされていないマシンでも可
-
pod install
実行の必要が無く、つまりインターネットアクセス環境も不要(訳注: とはいえリポジトリをクローンするタイミングでは大抵必要ですね)
-
Pod
成果物を常に使える状況を保つことが出来る- GitHubなど利用ライブラリがホストされている環境がダウンしても問題無し
-
Pod
成果物が完全に同一であることが保障される(訳注: 下の※1に関連)
バージョン管理に含めない利点
- リポジトリをコンパクト・省スペースに保てる
- GitHubなど利用ライブラリがホストされている環境がある限りは、
CocoaPods
は基本的に同じ成果物を再生成出来るようになっている- 技術的には、コミットハッシュ指定で無ければ、
pod install
で全く同一の成果物を再生成が保障、とは言えない(※1)
- 技術的には、コミットハッシュ指定で無ければ、
- 異なるPodバージョンを用いたブランチのマージなどでコンフリクト発生することを避けられる
Pods
ディレクトリをバージョン管理に含めるかどうかに関わらず、Podfile
・Podfile.lock
は常にバージョン管理に含めるべきである。
---ここまで訳---
補足
僕は、以下の理由で、バージョン管理に含めています
- 「バージョン管理に含める利点」> 「バージョン管理に含めない利点」と判断した
- CocoaPodsのオススメの方法を取っていた方が無難そう(個人的にもチーム開発的にも)
特に、iOSアプリ開発では、バグ検証や以前の挙動を確かめたい時など、過去のコミット行ったり来たりすることがあります。
その際、一々pod install
するのはかなり手間かかる、というのが個人的に一番大きな理由かもしれません。
(iOSアプリ開発の場合さらに、Xcodeのバージョンもそのコミット時点で使っていたものに揃える必要あったりして、それも面倒ですが。)
Carthage
は?
Carthage
も同様な感じですが、こちらはcarthage install
時にフレームワークとしてビルド済ませる方式なので、CocoaPodsと少し事情が違います。
僕は以下のように判断しています。
-
Carthage/Checkouts
: チェックアウトされたリポジトリ- こちらをバージョン管理に含めても、上の「バージョン管理に含める利点」の恩恵とは関係無く、逆に含めないことで「バージョン管理に含めない利点」の恩恵を得られる
-
Carthage/Build
: チェックアウトされたリポジトリを元にビルドされたフレームワークの出力場所- 上の「バージョン管理に含める利点」の恩恵を得るためにバージョン管理に含める必要あり
.gitignore
は次のようにしています。
通常iOSアプリ開発では、build
を.gitignore
に含めているので、!
指定でCarthage/Build
個別に除外(つまりバージョン管理に含める)しています。
Carthage/Checkouts
!Carthage/Build
[2018/06/11 追記] Carthage/Build
をバージョン管理に含める運用は止めました
コメント欄でもやり取りがあった通り、Carthage/Build
はサイズがかなり大きいバイナリファイルのためGitリポジトリの肥大化が激しく、 Pods
ディレクトリの扱いとはまた別物として考えるべきだと思いました。
そして、僕の愛用しているBitriseでは、Carthage/Build
をGitに含めなくとも簡単にビルド済みのキャッシュを流用することが可能なため、そのやり方に変えました。
How to cache Carthage dependencies - How To - Bitrise Discussions
僕の場合、過去に何度もCarthage/Build
をコミットして既存リポジトリが肥大化してしまっていたため、Gitの履歴は捨てて作り直しました(もちろん履歴も見たいことがあるので元々のリポジトリは別に隔離しつつ)が、その選択を取り難い場合は悩ましいですね
Bitriseでは簡単に対応できますが、そうでない場合はそう簡単にも行かないはずで、手間・ビルド時間などトータル判断でCarthage/Build
をGitリポジトリに含める運用は選択肢の1つだと今でも思っています。
含めない判断をしている方の意見も気になる🤔
「バージョン管理に含めない利点」に記載されている以外で、何か理由あったりしますかね🤔