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で、touch
、mkdir
、rm
、mv
などを使ってファイル、ディレクトリの新規作成、リネーム、削除を行うと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.xcodeproj
やPROJECT_NAME.xcworkspace
)を開いて、command
+ shift
+ K
でそのプロジェクトのDerivedDataのみがcleanされます。