1. mono0926

    Posted

    mono0926
Changes in title
+CocoaPods・Carthageでインストールした成果物はバージョン管理に含めるべきか?
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,71 @@
+以下のTwitterアンケートを見かけたので、記事書いてみました。
+結果は、母数が10人なので参考程度にするのが良いと思いますが、僕も多数派の「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/Chackouts`: チェックアウトされたリポジトリ
+ - こちらをバージョン管理に含めても、上の「バージョン管理に含める利点」の恩恵とは関係無く、逆に含めないことで「バージョン管理に含めない利点」の恩恵を得られる
+- `Carthage/Build`: チェックアウトされたリポジトリを元にビルドされたフレームワークを格納
+ - 上の「バージョン管理に含める利点」の恩恵を得るためにバージョン管理に含める必要あり
+
+`.gitignore`は次のようにしています。
+通常iOSアプリ開発では、`build`を`.gitignore`に含めているので、`!`指定で`Carthage/Build`個別に除外(つまりバージョン管理に含める)しています。
+
+```.gitignore
+Carthage/Checkouts
+!Carthage/Build
+```
+
+# 関連
+
+- http://qiita.com/kasajei/items/8c9ba3030c3eae736e89#comment-6e2575698769fb491966 など