Xcode16に上げたら、pod installができなくなった話
初めに
Xcode16に上げたらCocoaPodsが使えなくなったよ〜、助けてTOSHえもん〜。ということで助けるためにこの記事を書こうと思います。
TD;LR
See this
どうしたら再現する?
実はXcode16にしただけだと多分再現しないですね。
- Xcode16へとアップデートする
- ビルド対象をGroupからFolderへと変更する
おそらくこれで再現するようになるかと思います。
エラー
内容
pod系のコマンドを実行しようとすると下記のようなエラーが出てきます。
ArgumentError - [Xcodeproj] Unable to find compatibility version string for object version `70`.
これです。
解析
これだけだと何が原因かわからないと思うので、もう少し解析してみましょう。
ArgumentError - [Xcodeproj] Unable to find compatibility version string for object version `70`.
/opt/homebrew/Cellar/cocoapods/1.16.0/libexec/gems/xcodeproj-1.26.0/lib/xcodeproj/project.rb:85:in `initialize'
/opt/homebrew/Cellar/cocoapods/1.16.0/libexec/gems/cocoapods-1.16.0/lib/cocoapods/project.rb:48:in `initialize'
エラーの前後の数行を出してみました。どうやら、cocoapodsが内部依存として持っているxcodeproj側でエラーを出してそうです。
ここの周辺コードを見てみましょう。
ここです。どうやら、プロジェクトのobject_version何らかの値がCOMPATIBILITY_VERSION_BY_OBJECT_VERSIONにマッチしていなかったために終了してそうです。
では、いったいこのobject_versionとは何で、COMPATIBILITY_VERSION_BY_OBJECT_VERSIONとはいったい何なのでしょうか?
object_versionとは
プロジェクトの、.pbxproj
ファイル内に存在するobjectVersion = <value>;
が該当項目になります。今回このプロジェクトを見てみるとobjectVersion = 70;
のようになっていました。どうやらエラーの内容と一致してそうです。
ではこの値はいったい何が入っているといいのでしょうか?
xcodeprojのソースコードへと戻ります。
# @return [Hash] The compatibility version string for different object versions.
#
COMPATIBILITY_VERSION_BY_OBJECT_VERSION = {
77 => 'Xcode 16.0',
63 => 'Xcode 15.3',
60 => 'Xcode 15.0',
56 => 'Xcode 14.0',
55 => 'Xcode 13.0',
54 => 'Xcode 12.0',
53 => 'Xcode 11.4',
52 => 'Xcode 11.0',
51 => 'Xcode 10.0',
50 => 'Xcode 9.3',
48 => 'Xcode 8.0',
47 => 'Xcode 6.3',
46 => 'Xcode 3.2',
45 => 'Xcode 3.1',
}.freeze
どうやら、Xcode16系であれば77であることが期待されており、70といった数値は予期されていなさそうです。これが原因で、pod installが失敗してそうでした。
対応方法
(NG)手動で、pbxprojのobjectVersionを77にする
NGです。pod installはできるようになるのですが、例えばフォルダ追加やpod installといった.pbxprojに対して変更が入る修正を入れるたびに70へと戻してしまうようです。
objectVersionはあくまで機械的に管理されるものなので、手動で変えるものではないようです。
ではいったいどこを変えれば良いのでしょうか?
Project FormatをXcode 16にする
.pbxproj内のobjectVersionはGUI上のProjectFormatに依存しています。なので、ここを変えてあげる必要があります。
これをあげることで、objectVersionも自動で適切な値へと変更してくれます。
objectVersionの挙動についてまとめてみましょう。
Xcode 16を使っている && Folder参照にしている && ProjectFormatがXcode 16ではない
の場合のみxcodeprojに定義のないobjectVersion: 70になるのでpod installが失敗する。
まとめ
I am a lifesaver.
Discussion