🏋️‍♀️

Xcode 16からビルド対象をGroupからFolder構成に変換するメニューができてる

2024/08/16に公開

もしみなさんのレガシープロジェクトがローカルSwift Pacakge構成にできていなくてpbxprojのコンフリクトが起こりまくってるなら、Xcode 16にしたらまず試してほしいメニューができましたよという話です。

最初に結論

  • ビルド対象をGroupとして追加していてもFolderに変更するメニューがXcode 16から追加された
  • Folderにすることでビルド対象をFolder以下とできるのでpbxprojには各ファイルは記載されない
    • pbxprojのコンフリクトが起きる可能性が減る
  • 懸念点
    • 複数Targetに追加されてるファイルはどうなる?
      • できるけどpbxprojにはファイル名残る

ドキュメントから

Xcode 16 Betaのリリースノート、 Project Managementから
https://developer.apple.com/documentation/xcode-release-notes/xcode-16-release-notes#Project-Management

Convert an existing group to a buildable folder with the “Convert to Folder” context menu item in the Project Navigator. Buildable folders only record the folder path into the project file without enumerating the contained files. This minimizes diffs to the project when files are added and removed, and avoids source control conflicts with your team.

解釈:

Project Navigator上で既存のGroupを選択してコンテキストメニューアイテムから“Convert to Folder”を選択すると、Folderをビルド対象に変換します。これはフォルダのパスをpbxprojに記載し、フォルダ下のファイルがビルド対象となります。今までのGroupでのビルド対象はファイルひとつずつをpbxprojに記載しており、ファイルを追加削除するとそれがpbxpojの変更につながっていました。これがメニューからFolderをビルド対象にできるようになったというわけで、Folder以下のファイルが物理的に追加/削除された場合はビルド対象に追加/削除されることになり、pbxprojに変更は生じません。

懸念点

複数Targetに追加されたファイルの場合どうなる?

1つのHostApplication用のファイルをWidgetなどEmbedded Frameworkが参照する場合があり、この場合もメニューからのConvert to Folderはできます。

できますが、複数ターゲットに指定されてるものはそのファイル名がpbxprojに記載されます。つまりファイル名が残るものは当然コンフリクトの可能性は下がらないですが、これはしょうがないと思います。

その他

デフォルトもFolderになっている

Xcode 16からはアプリ開発時の構成がデフォルトでFolderになっています

もともとFolderビルドというのはXcode 4くらいからあったと思う

て念のため書いておくと、Xcode 15以前もFolderを対象にすることができなかったわけじゃなく、私の知ってる限り、Xcode 4くらいからFolderを対象にできていたんですが、Xcode 16以降は変換メニューがついたよということだと思います。

なのでXcode 14でも15でも新規ファイル追加時にGroupではなくFolder的な追加が今もできるはずです。なのでXcode 16にする前に手動でファイルをFolder構成でやっていくことはできるんじゃないかと思います。

Discussion