大人数でiOS開発を行ってXcodeの管理ファイル`project.pbproj`のコンフリ解決を行った経験より(2020-09-02)

project.pbprojのコンフリ解決

大人数でiOS開発を行ってXcodeの管理ファイルproject.pbprojのコンフリ解決を行った経験より(2020-09-02)

project.pbprojとは

project.pbprojはXcodeの管理ファイルです。
そんなんいったいどこにあるんやと言う感じですかね。

.
├── PROJECT_NAME
│   ├── AppDelegate.swift
│   ├── Assets.xcassets
│   ├── Base.lproj
│   ├── Info.plist
│   ├── SceneDelegate.swift
│   └── etc...
├── PROJECT_NAME.xcodeproj
│   ├── project.pbxproj
│   ├── project.xcworkspace
│   └── xcshareddata
├── PROJECT_NAME.xcworkspace
│   ├── contents.xcworkspacedata
│   ├── xcshareddata
│   └── xcuserdata
├── Podfile
├── Podfile.lock
└── Pods

この図のようにPROJECT_NAME.xcodeprojディレクトリの直下にあります。
管理ファイルとは、エディターがプロジェクトやワークスペースのファイルを管理するためにファイルとその参照などが書かれているファイルです。
これがないとXcodeがソースファイルを正常にコンパイルできません。

Xcodeでのファイル管理の前提

基本的にXcodeで管理されているプロジェクトのファイルを新規作成、リネーム、削除する場合はXcodeのGUIを用いて操作することが必要です。
これによって、その変更内容がproject.pbprojに書き込まれ、Xcodeがそれぞれのファイルを実行することができるようになるのです。
もしCLIで、touchmkdirrmmvなどを使ってファイル、ディレクトリの新規作成、リネーム、削除を行うとXcodeがそのファイルやディレクトリを参照できず、エラーが起こります。

Xcode + GitHubでの問題点

大人数のiOS開発においてはproject.pbprojのコンフリクトが発生することがあります。
主にファイルが増えたときと、ファイルを消したときに起こります。
以下のようにproject.pbprojのコンフリを解決していきます。

# master <- develop のmergeを例にあげます。
$ git checkout master
$ git merge develop # ここでコンフリクト発生
$ git checkout --ours -- PROJECT_NAME.xcodeproj/project.pbproj # project.pbprojだけはmerge先のブランチの内容を採用
# source filesは自力でコンフリ解決
$ git add .
$ git commit

以上をコンフリがなくなるように行います。
これによって、conflict markers(<<<<<<<とか=======の記号)が消えて、一応コンフリは見かけ上解決しました。
ここでXcodeを開くと、ファイルがあるが参照がないファイルが赤色の文字で、参照があるがファイルがないものが灰色の字で表示され、buildできません。
これに対し、XcodeのGUIで操作して手動で解決してあげましょう。
こういった参照切れのエラーなどは基本的にGUI操作で行うことが鍵です。
参照が切れているファイルをFinderで表示し、navigatorにドラッグアンドドロップしてあげればうまく走るはずです。

そのほかの注意点

よく使うbuildできないときの対処法もメモしておきます。
CocoaPodsで管理しているframeworkが揃っていなかったり、CocoaPodsのバージョンが違う場合にerrorが起こることがあります。
以下のコマンドで解決するはずです。

$ pod install

以下はCocoaPodsのキャッシュを削除するコマンドです。
コンフリ解決にはあまり関係ないですが、Xcodeを軽くしてフリーズなどから復帰できます。

$ pod cache clean --all

Xcodeはbuildの際にDerivedDataという中間生成ファイルを生成しますが、この掃除をすることでbuildが通ることがあります。
DerivedDataは~/Library/Developer/Xcode/DerivedDataに保存されているので、以下のコマンドで掃除してあげます。
このディレクトリ内にはほかのプロジェクトのDerivedDataも保存されているので、以下のコマンドでは全てのプロジェクトのDerivedDataが削除されます。

$ rm -rf ~/Library/Developer/Xcode/DerivedData

別にこのファイルを消しても次回のbuildが遅くなる程度の問題しか起きないので気にするべきではないと思いますが、個別に削除したい場合は個別のDerivedDataを削除してください。
方法としてはXcodeでそのプロジェクト(PROJECT_NAME.xcodeprojPROJECT_NAME.xcworkspace)を開いて、command + shift + KでそのプロジェクトのDerivedDataのみがcleanされます。

おすすめ

人気の投稿

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です