LoginSignup
9
2

More than 1 year has passed since last update.

XcodeGenでフォルダ参照した時の罠

Last updated at Posted at 2021-12-20

XcodeGenでは指定しなければ基本、ディレクトリはすべて自動でグループとして扱われる。
そのためフォルダ参照したい場合は、フォルダ参照するパスのタイプを指定する必要がある。
ここまでは公式仕様にも書かれているのでわかる。
が、さらに罠があったので共有したい。

わかりやすいように以下にサンプルプロジェクトを配置したので、これを使って説明していきたい。
https://github.com/yumemi-ajike/FolderReferencesWithXcodeGen

  • Xcode13.1
  • XcodeGen2.25.0

グループとして参照

targets: sources: で指定した path以下のディレクトリ群はグループとして扱われるため

targets:
  FolderReferencesWithXcodeGen:
    type: application
    platform: iOS
    sources:
      - path: FolderReferencesWithXcodeGen
        excludes:
          - Info.plist

こうなるのがデフォルト仕様。

1_base.png

しかし、最終的には.appのリソースの中でImagesフォルダを持ちたいとすると、このままだとNG。

フォルダ参照

targets: sources: で指定したパスの type:folder で指定する必要がある。
公式仕様にも明記されている。

targets:
  FolderReferencesWithXcodeGen:
    type: application
    platform: iOS
    sources:
      - path: FolderReferencesWithXcodeGen
        excludes:
          - Info.plist
      - path: FolderReferencesWithXcodeGen/Images # <-New
        type: folder # <-New

これで一見よさそうだが、何故かグループとしても扱われてしまい、ProjectでもBuild Phase のCopy Bundle Resourcesでもフォルダ参照とグループ参照としての内部ファイル群の両方が追加される形となってしまう。。なんでやねん

Project Build Phase のCopy Bundle Resources
2_folderref_only_1.png 2_folderref_only_2.png

フォルダ参照 + グループ参照を省く

targets: sources: で指定した pathで Images以下がグループ参照されてしまわないようにしたいので excludes の指定にImagesを追加する。

https://github.com/yumemi-ajike/FolderReferencesWithXcodeGen/blob/23f9c1a7a4145f156040661bbde9df08f0308e4d/project.yml#L18-L28

targets:
  FolderReferencesWithXcodeGen:
    type: application
    platform: iOS
    sources:
      - path: FolderReferencesWithXcodeGen
        excludes:
          - Info.plist
          - Images # <-New
      - path: FolderReferencesWithXcodeGen/Images
        type: folder
Project Build Phase のCopy Bundle Resources
3_folderref_with_excludes_1.png 3_folderref_with_excludes_2.png

これでグループ参照の重複が解消され、最終的に.appのリソースにはImagesフォルダ以下が入ることになる。

確認

アプリ起動時に.appのリソース内/Images/tree.jpgがあるか確かめる。

https://github.com/yumemi-ajike/FolderReferencesWithXcodeGen/blob/23f9c1a7a4145f156040661bbde9df08f0308e4d/FolderReferencesWithXcodeGen/AppDelegate.swift#L15-L17

        if let fileURL = Bundle.main.resourceURL?.appendingPathComponent("Images").appendingPathComponent("tree.jpg") {
            print("filePath exists: \(FileManager.default.fileExists(atPath: fileURL.path))")
        }

.appのリソース内/tree.jpgが無いか確かめる。
https://github.com/yumemi-ajike/FolderReferencesWithXcodeGen/blob/23f9c1a7a4145f156040661bbde9df08f0308e4d/FolderReferencesWithXcodeGen/AppDelegate.swift#L19-L21

        if let fileURL = Bundle.main.resourceURL?.appendingPathComponent("tree.jpg") {
            print("filePath exists: \(FileManager.default.fileExists(atPath: fileURL.path))")
        }
9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2