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


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

ちょうど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ディレクトリをバージョン管理に含めるかどうかに関わらず、PodfilePodfile.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つだと今でも思っています。

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

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

関連