🙆
pointfree/isowordsに学ぶPackage.swiftの配置
リポジトリを見てて思う疑問
前提条件
- トップレベルにSwiftPMのパッケージが配置してある
- その中にAppやBootstrap, Assetsなどのディレクトリが配置されている
- 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