Closed
6

xcworkspaceと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
   23// Leave blank. This is only here so that Xcode doesn't display it.
   45import PackageDescription
   67let 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
   23// Leave blank. This is only here so that Xcode doesn't display it.
   45import PackageDescription
   67let 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
   23// Leave blank. This is only here so that Xcode doesn't display it.
   45import PackageDescription
   67let package = Package(
   8   │   name: "client",
   9   │   products: [],
  10   │   targets: []
  11)
───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

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

この効果によって、Exampleやモジュールではないアプリ本体をモジュール外として宣言することが可能

このスクラップは12日前にクローズされました
作成者以外のコメントは許可されていません