CocoaPods・Carthageでインストールした成果物はバージョン管理に含めるべきか？

以下のTwitterアンケートを見かけたので、記事書いてみました。
結果は、母数が10人なので参考程度にするのが良いと思いますが、~~僕も多数派の「CocoaPodsもCarthageも含めている」を特に迷い無く選択しています~~僕は今ではCocoaPodsもCarthageも含めていない運用にしています。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">【iOSアプリプログラマに質問】<br>あなたはアプリのリポジトリにCocoaPodsで取得したソースコードやCarthageでビルドしたフレームワークを含めていますか？</p>&mdash; りず (r.izumita) (@rizumita) <a href="https://twitter.com/rizumita/status/783916764031770624">October 6, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ちょうどCocoaPodsのガイドにこのことが記載されているので、まずはその訳を載せます。
(この記載はわりと有名なはずで、ここでオススメされているからバージョン管理に含める選択を取っている人も多そう。)

# CocoaPodsのガイドの訳

原文: https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control

## 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`個別に除外(つまりバージョン管理に含める)しています。

```.gitignore
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](https://discuss.bitrise.io/t/how-to-cache-carthage-dependencies/197)

僕の場合、過去に何度も`Carthage/Build`をコミットして既存リポジトリが肥大化してしまっていたため、Gitの履歴は捨てて作り直しました(もちろん履歴も見たいことがあるので元々のリポジトリは別に隔離しつつ)が、その選択を取り難い場合は悩ましいですね :thinking: 

Bitriseでは簡単に対応できますが、そうでない場合はそう簡単にも行かないはずで、手間・ビルド時間などトータル判断で`Carthage/Build`をGitリポジトリに含める運用は選択肢の1つだと今でも思っています。

## 含めない判断をしている方の意見も気になる🤔

「バージョン管理に含めない利点」に記載されている以外で、何か理由あったりしますかね🤔

# 関連

- http://qiita.com/kasajei/items/8c9ba3030c3eae736e89#comment-6e2575698769fb491966 
- [CocoaPods を .gitignore すべきか - Qiita](http://qiita.com/star__hoshi/items/1f06a58275cdd0b6e450)