🙏🏻

React Nativeのproject.pbxprojのアップデートはしなくていい

2022/12/18に公開

はじめに

React Nativeの開発の中で最もくるs・・・もとい、楽しい作業の1つであるアップデート作業についての話です。
React Nativeのアップデート作業には、だいたいの人はコミュニティ提供のReact Native Upgrade Helperを使うことが多いと思います。
巷では神に見放されたツールとも呼ばれていますが、これなしにReact Nativeのアップデートはできません。
マイナーバージョンが上がる度に、毎回震えて差分を確認しています。

React Native Upgrade Helperの差分の中にはproject.pbxprojが含まれていることもあり、
(diffが多すぎて閉じられている)パネルを展開してdiffの多さと意味のわからなさにPCをそっ閉じしたことは誰もが経験したことでしょう。

project.pbxprojとは

これはXCodeの設定ファイルになります。
XCodeの設定ファイルであるproject.pbxprojは基本的に直接編集するファイルではありません。

ネイティブの機能を使えるようにしたり、stagingビルドができるようにした際にはXCodeで設定することになります。
普通にXCodeのアプリを開いてGUI上で設定することになりますが、この設定した内容がproject.pbxprojにも保存されています。
diffを確認するとわかりますが、とても人間が理解できる内容ではないです。
また、project.pbxprojの内容は作成したプロジェクトごとに異なります。

そして、このファイルの差分がReact Native Upgrade Helperにはでてくるのです。
当然ですが、このファイルをいい加減に編集するとiOSのビルドはぶっ壊れます。

project.pbxprojの差分はどういうものなのか

React Native Upgrade Helperで0.66.0 => 0.67.0のproject.pbxprojの差分を一部持ってきました。
これはほんの一部で、全文はこちらから確認できます(※グロ注意)

project.pbxprojの差分

この差分の何がわからないって、バイナリーのような英数字の部分ですね。
上の画像だと7062A1363093D3B60DEA03CCとか8DB7059CAED531BC45B2821Cなどの数字がこれにあたります。
こちらの英数字はXCodeのオブジェクトを指すユニークなIDとなっており、これがプロジェクトごとに異なります。
React Native Upgrade Helperのdiffをそのまま持ってきても意味がないです。
奇跡的に一致していれば、そのまま持ってこれますが・・・。

なお、この英数字はproject.pbxprojの中で変数のように扱われてます。
変数と同じように定義して、いたる箇所で参照されているのがproject.pbxprojの中を読むと確認することができます。
安易に消したり編集していいものではないので、注意してください。

pod installした結果のproject.pbxprojの差分を信じる

この差分をどうすればいいのかについては、React Native、コミュニティーのupgrade-supportなどで散々issueが立てられています。
もちろん、React Native Upgrade Helperのリポジトリにも立てられています。

コミュニティーのメンバーによると、このReact Native Upgrade Helperででてきたproject.pbxprojの差分は取り込まないで良いとのことです。
こちらのissueの手順通りにやれば大丈夫です。
このissue自体はReact Native 0.62のアップデートでかなり昔のものですが、project.pbxprojのアップデートどうすればいいのか系の質問は、だいたいこのissueのリンクが投げられています。
upgrade-supportにもずっとこのissueがピン止めされてもいるので、これが実質的なコミュニティーからの回答ということなんでしょう。

issueの内容を要約すると、下記の手順になります。

  1. *.xcodeproj以外の全ての差分を取り込む
  2. yarn installで依存モジュールを更新する
  3. iosフォルダに移動してpod installする
  4. 全ての差分を取り込む

ネイティブの機能を要するモジュールを入れた際はpod installしますが、React Nativeのアップデートをした際にもやっておいた方が良いです。
モジュールを入れた時のpod installではproject.pbxprojに差分が出ることは基本的にありませんが、React Native自体のバージョンを上げた際のpod installでは差分が生じることがあります。
この差分を取り込むことが、project.pbxprojのアップデートに相当します。

手動でproject.pbxprojをアップデートしても、pod installすると元に戻る

project.pbxprojの差分は大体エグいですが、奇跡的に楽なやつがあったので検証してみました。
0.66.4 => 0.66.5のアップデートは、コードの削除だけとなるので、手動でもできそうです。
で、試しに手動で手元のproject.pbxprojのそれっぽい箇所を消して回りました。

この状態でyarn iosをすると、立ち上がりますがオブジェクトのIDが一致しないからpod installをしろよという警告がでてきます。
言われた通りpod installすると、0.66.4 => 0.66.5で消した差分は全て復活します。
オブジェクトのIDは変わってしまいましたが・・・
以降はyarn iosしても警告がでることもなく、普通にビルドが完了します。

このことからも、pod installした結果を信じるのが1番良さそう

とはいえ、手動でいじらないといけないこともある

コミュニティのissueの中に、興味深いものを見つけました。
どうやら、必要なこともあるみたいです。
https://github.com/react-native-community/upgrade-support/issues/136#issuecomment-1081086691

for the most part not changing the project.pbxproj should just work, however it might be worth noting that with
some react native version changes there may be changes to the project.pbxproj that could be needed.

(訳)ほとんどの場合、project.pbxproj を変更しなくても機能するはずですが、react ネイティブ バージョンの変更によっては、project.pbxproj に変更が必要になる可能性があることに注意してください。

project.pbxprojのアップデートの仕方

差分がでているReact Native Upgrade HelperのXCodeのオブジェクトIDが、自プロダクトのXCodeのオブジェクトIDだとどれに相当するのかのマッピングを行います。
1つ1つ紐解いて、削除したり追加したりしていきます。

地獄です

さいごに

pod installして動くことを神に祈りましょう。

GitHubで編集を提案
CureApp テックブログ

Discussion