【Xcode/iOS】Swift Package Managerでマルチモジュール化する方法!
この記事からわかること
- Swift Package Managerとは?
- Xcode/SPMでマルチモジュール化する方法
index
[open]
\ アプリをリリースしました /
環境
- Xcode:16.3
- iOS:18.0
- Swift:6
- macOS:Sequoia 15.4
この記事はSPM(Swift Package Manager)を使用してマルチモジュール化を軽くやってみたという記事になっています。
SPMでマルチモジュール化する方法
SPMでアプリの構造自体をマルチモジュール化していくためにはSPMの使い方を把握しておく必要があります。詳細は以下の記事を参考にしてください。
今回は機能ごとに3つのモジュールに分けて管理するような想定で作成してみます。例として以下のようにしましたが実際のアプリではドメインごとにモジュールを作成してその中に画面やViewModelを閉じ込めていくようにしていけば良いと思います。
- CoreModule・・・全モジュール共通
- NetworkModule・・・ネットワーク関係のロジックのみ
- UIModule・・・UI関連のみ
このマルチモジュール想定での「Package.swift」の中身が以下になります。
import PackageDescription
let package = Package(
name: "Sample-Mulch-Module-App",
platforms: [
.iOS(.v16)
],
products: [
.library(name: "CoreModule", targets: ["CoreModule"]),
.library(name: "NetworkModule", targets: ["NetworkModule"]),
.library(name: "UIModule", targets: ["UIModule"])
],
targets: [
.target(
name: "CoreModule",
// マルチモジュールにするので明示的にパスを指定する
path: "Sources/CoreModule"
),
.target(
name: "NetworkModule",
// 依存するモジュールを指定する
dependencies: ["CoreModule"],
path: "Sources/NetworkModule"
),
.target(
name: "UIModule",
// 依存するモジュールを指定する
dependencies: [
"CoreModule",
"NetworkModule"
],
path: "Sources/UIModule"
)
]
)
中身はすごい適当ですが全てに依存しているUIModuleではCoreModuleもNetworkModuleを使用することができます。しかし例えばNetworkModuleではCoreModuleは使えてもUIModuleは使用できないようになります。
import SwiftUI
import CoreModule
import NetworkModule
public struct MyUIView: View {
public var body: some View {
Button {
Network.printOnline()
} label: {
Text(Core.text)
}
}
}
このようにマルチモジュール化することによって必要なモジュール単位での依存に抑えることができるのでコードが複雑に入り混じり影響範囲が掴めなくなってしまうような構成を避けることができます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。







