koogawa blog

iOS、Android、foursquareに関する話題

CocoaPodsがpbxprojをXMLに書き換えてしまう件

CocoaPodsのバージョンを 0.33 から 0.35 に上げたあたりから、

pod install または update

する度にpbxprojファイルの形式が XML に書き換えられてしまうようになった。

調べているうちに、次のドキュメントに行き着いた。

CocoaPods Guides - F.A.Q

Xcode projects are ‘PList’ documents. Internally, PList documents can be serialised in a number of ways, two of which are the (OpenStep) ASCII format and a XML format. The former has been deprecated and can no longer be written to disk by official APIs such as the CFPropertyList API. While Xcode still uses this deprecated format, we chose to depend on the CFPropertyList API and not implement custom serialisation code for a format that might be removed without notice.

If you make a change to your project Xcode (currently) will overwrite this change and will save the document in its internal extended ASCII PList format. This is the simplest way for us to support saving Xcode projects without trying to replicate Xcode's internals.

By installing xcproj, CocoaPods will be able to write the same deprecated (OpenStep) ASCII plists format as Xcode does.

ポイントをまとめると、

  • plist には次の3つのフォーマットがある(参考
    • OpenStepFormat (deprecated)
    • XMLFormat_v1_0
    • BinaryFormat_v1_0
  • Xcode は pbxproj ファイルを非推奨の OpenStepFormat で書き出す
  • CocoaPods も元々は OpenStepFormat で pbxproj を書き出していた
    • v0.34 あたり?から XMLFormat_v1_0 で書き出すようになった
    • CFPropertyList APIのような公式APIで OpenStepFormat を扱えなくなったのが原因

図解するとこんな感じ。

f:id:koogawa:20150204002155p:plain

今まで OpenStepFormat で書き出されていたのが、XMLFormat_v1_0 で書き出されるようになってしまった。

f:id:koogawa:20150204002211p:plain

対処法 1

Xcodeからプロジェクトファイルに何らかの変更を加え、pbxprojファイルを上書きすることで、ファイル形式がOpenStepFormatに戻るらしい。これが最も簡単な方法。

対処法 2

xcproj をインストールする。こうすることで、CocoaPodsが従来のOpenStepFormatで書き出せるようになる。

$ brew install xcproj

とりあえず上のどちらかで対処しようと思うけど、他の皆さんはどうやってるのか気になります。

追記(2/4 1:00)

「XMLFormat_v1_0で書き出されると何か問題が出てくるのでしょうか?」というご質問を頂きました!(確かにこの部分を書いてませんでした…^^;)

こちらについては

  • おそらくXMLFormat_v1_0でも問題はないと思いますが、ファイル構成に変更を入れていないのに差分がどっさり出てしまうのが気持ち悪い(うっかりミスがあっても気付けなそう)、というのがひとつ
  • また、複数人で開発しているので、後でソースをマージするときにめちゃくちゃになりそう

というのが回答になりますm( )m