🙆

pointfree/isowordsに学ぶPackage.swiftの配置

に公開

リポジトリを見てて思う疑問

前提条件

  1. トップレベルにSwiftPMのパッケージが配置してある
  2. その中にAppやBootstrap, Assetsなどのディレクトリが配置されている
  3. xcworkspaceに記述されている情報はトップレベルの FileRefのgroup:のみ

ディレクトリ情報

 ❯ ls                                                                                                                                                                                                              [22:00:53]
App  Assets  Bootstrap  isowords.xcworkspace  
LICENSE.md  Makefile  Package.swift  
README.md  Sources  Tests
 ❯ bat isowords.xcworkspace/contents.xcworkspacedata                                                                                                                                                               [03:20:13]
───────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: isowords.xcworkspace/contents.xcworkspacedata
───────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ <?xml version="1.0" encoding="UTF-8"?>
   2   │ <Workspace
   3   │    version = "1.0">
   4   │    <FileRef
   5   │       location = "group:README.md">
   6   │    </FileRef>
   7   │    <FileRef
   8   │       location = "group:App/isowords.xcodeproj">
   9   │    </FileRef>
  10   │    <FileRef
  11   │       location = "group:">
  12   │    </FileRef>
  13   │ </Workspace>

これによってXcodeでのダンボール内に表示される情報はこれ

なにか違和感がある🤔 🤔 🤔
Assetsとかどこ行った?

違和感の正体

実は何も考えずに上のようにxcworkspaceのデータが入っていると以下のような形になる。
いわゆるダンボール内にAppがあるが、xcodeprojで参照したものも展開されるので同一のものが複数の箇所に表示されている状態

それぞれのディレクトリ配下の構成に注目するとすべてに何故かPackage.swiftが入っている

 ❯ tree -L 2                                                                                                                                                                                                       [22:07:31]
.
├── App
│   ├── AppClip
│   ├── Config
│   ├── Package.swift
│   ├── Previews
│   ├── README.md
│   ├── iOS
│   └── isowords.xcodeproj
├── Assets
│   ├── Package.swift
│   ├── border.sketch
│   └── letters.sketch
├── Bootstrap
│   ├── Dockerfile
│   ├── Package.swift
│   ├── development-compose.yml
│   ├── development.dockerfile
│   ├── iso-env-example
│   ├── sqlite-words-import.sql
│   └── test.sh
├── LICENSE.md
├── Makefile
├── Package.swift
├── README.md

それぞれの中身はほぼ空のパッケージ

 ❯ bat App/Package.swift                                                                                                                                                                                           [22:09:13]
───────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: App/Package.swift
───────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ // swift-tools-version:5.2
   2   │
   3   │ // Leave blank. This is only here so that Xcode doesn't display it.
   4   │
   5   │ import PackageDescription
   6   │
   7   │ let package = Package(
   8   │   name: "client",
   9   │   products: [],
  10   │   targets: []
  11   │ )
───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

 ❯ bat Assets/Package.swift                                                                                                                                                                                        [22:09:18]
───────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: Assets/Package.swift
───────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ // swift-tools-version:5.2
   2   │
   3   │ // Leave blank. This is only here so that Xcode doesn't display it.
   4   │
   5   │ import PackageDescription
   6   │
   7   │ let package = Package(
   8   │   name: "assets",
   9   │   products: [],
  10   │   targets: []
  11   │ )
───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

 ❯ bat Bootstrap/Package.swift                                                                                                                                                                                     [22:09:25]
───────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: Bootstrap/Package.swift
───────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ // swift-tools-version:5.2
   2   │
   3   │ // Leave blank. This is only here so that Xcode doesn't display it.
   4   │
   5   │ import PackageDescription
   6   │
   7   │ let package = Package(
   8   │   name: "client",
   9   │   products: [],
  10   │   targets: []
  11   │ )
───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Package.swiftがあるディレクトリは無視できる

nameだけが存在する空のPackage.swiftを無視させたいディレクトリに配置する。
上の階層にPackage.swiftがありgroup:で指定しているような状態の時には各ディレクトリをダンボールから無視するような挙動を示す。

したがって、この効果によってExampleやモジュールではないアプリ本体のディレクトリに空のPackage.swiftを配置することでダンボールから外すことができた🙆

Discussion