【iOS】新規プロジェクトにSPMマルチモジュールを採用する際の手順書


## 目的
- SPMマルチモジュール化の手順を整理すること
    - 既にいくつか 手順を整理した記事 は存在していますが、`取り組みやすさ`を優先し自分なりにまとめてみました
- 備忘録


## ゴール

以下のような、`SPMマルチモジュール構成`を採用したプロジェクトを作れるようになること

<img width = 90% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/53d5cdef-4822-8317-bd34-c3fe80feed95.png">


## 前提
SwiftUIベースの`初期プロジェクト`作成
今回は初期プロジェクトを`SPMViewTranslation`とします


## 手順

### パッケージを生成 (1/4)

- [ ] パッケージ用のフォルダを作成 (`SPMViewTranslationPckage`)
- [ ] フォルダをパッケージ化

```.bash
$ cd ~~~~/SPMViewTranslation
$ ls
SPMViewTranslation.xcodeproj	SPMViewTranslationUITests
SPMViewTranslation		SPMViewTranslationTests
$
$ mkdir SPMViewTranslationPckage   // 名称は任意, 初期プロジェクト名とは被らないよう注意
$ cd SPMViewTranslationPckage
$ swift package init   // パッケージ化
Creating library package: SPMViewTranslationPackage
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/SPMViewTranslationPackage/SPMViewTranslationPackage.swift
Creating Tests/
Creating Tests/SPMViewTranslationPackageTests/
Creating Tests/SPMViewTranslationPackageTests/SPMViewTranslationPackageTests.swift
$
$ ls
Package.swift	Sources		Tests
```

:::note warn
SPMを初期化する際のディレクトリは、SPMViewTranslation と名称を被らせないようにする必要があります。
今回は ディレクトリを `SPMViewTranslationPckage` (= SPMViewTranslation + Package) という名称にしています。
SPMViewTranslation と名称が被った場合、パッケージとして読み込んでくれません。注意してください。
:::

`ディレクトリ構造`確認
```console.bash
$ cd ~~~~/SPMViewTranslation
$ tree -L 2   // brew で tree をインストールする必要がある
├── README.md
├── SPMViewTranslation
│   ├── SPMViewTranslation
│   ├── SPMViewTranslation.xcodeproj
│   ├── SPMViewTranslationTests
│   └── SPMViewTranslationUITests
└── SPMViewTranslationPackage
    ├── Package.swift
    ├── Sources
    └── Tests
```

<br>

### マルチモジュール化 (2/4)

- [ ] `SPMViewTranslation.xcodeproj` を開き、GIFのように (Package.swiftの親ディレクトリである)`SPMViewTranslationPackage` を .xcodeproj へ追加する。


```.bash
$ cd ~~~~/SPMViewTranslation
$ open SPMViewTranslation/SPMViewTranslation.xcodeproj
```

<img width = 90% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/a276c4e2-eaf3-5458-09de-e1c5f42e56cb.gif">


<br>

### パッケージの整理 (3/4)

- [ ] `不要なフォルダ`を削除
Sources/SPMViewTranslationPackage
Tests/SPMViewTranslationPackageTests

```.bash
$ cd ~~~~/SPMViewTranslationPackage   // Package です
$
$ ls Sources
SPMViewTranslationPackage
$ rm -rf Sources/SPMViewTranslationPackage
$ 
$ ls Tests
SPMViewTranslationPackageTests
$ rm -rf Tests/SPMViewTranslationPackageTests
```

- [ ] フォルダの削除に合わせて、Package.swift を変更

```Package.swift
import PackageDescription

let package = Package(
    name: "SPMViewTranslationPackage",
    products: [
    ],
    dependencies: [
    ],
    targets: [
    ]
)
```


<br>

### モジュールの追加 (4/4)

- [ ] Source 配下に Featureフォルダを作成

- [ ] Featureフォルダに FirstView.swift を追加

Package.swift を以下のように設定

```diff
import PackageDescription

let package = Package(
    name: "SPMViewTranslationPackage",
+   platforms: [.iOS(.v17)],   // プロジェクトによって異なる
    products: [
+       .library(name: "Feature", targets: ["Feature"])
    ],
    dependencies: [
    ],
    targets: [
+       .target(name: "Feature")
    ]
)
```

```FirstView.swift
import SwiftUI

struct FirstView: View {
    var body: some View {
        Text("First View!")
    }
}

#Preview {
    FirstView()
}
```

<br>

**良いSPMマルチモジュールライフを！**


### 参考

https://zenn.dev/kalupas226/articles/73118709e316ad