✈️
SwiftPMでローカルコードのパッケージ化手順
本記事の内容
SwiftPM(SPM)は大体以下2つの目的で利用しますが、この記事では2つ目のローカル実装のパッケージ管理を行う際の手順を説明します。
参考にした記事は最後に記載しています
- ライブラリ管理
- ローカルのコードを機能単位などでパッケージ管理
環境
- macOS Sonoma 14.7
- Xcode16.2
手順
1. パッケージブロックを新規作成
まず、XcodeでAppプロジェクトを作成。
ここにパッケージ化するLoginPackageを作成していきます。
ターミナルからコマンドを打っていきます。
# 現在のディレクトリ
ls
> App App.xcodeproj AppTests AppUITests
# ディレクトリ作成
mkdir LoginPackage
# 移動
cd LoginPackage
# SPM化
swift package init
> Creating library package: LoginPackage
> Creating Package.swift
> Creating .gitignore
> Creating Sources/
> Creating Sources/LoginPackage/LoginPackage.swift
> Creating Tests/
> Creating Tests/LoginPackageTests/
> Creating Tests/LoginPackageTests/LoginPackageTests.swift
2. LoginPackage(Package.swiftが含まれるディレクリ)をXcodeにドラッグ&ドロップ
LoginPackageをAppプロジェクト直下にドラッグ&ドロップします。
Xcodeが認識しないので、LoginPackageをAppと同じディレクトリに移動しています。
Finishします。
ドラッグ&ドロップ後
3. Package.swift更新
試しにContentView.swiftをLoginPackageに移動してパッケージ外から参照できるようにします。
Package.swift
// swift-tools-version: 6.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "LoginPackage",
platforms: [.iOS(.v17)],
products: [
.library(
name: "LoginPackage",
targets: ["LoginPackage"]),
],
dependencies: [],
targets: [
.target(
name: "LoginPackage"),
.testTarget(
name: "LoginPackageTests",
dependencies: ["LoginPackage"]
),
]
)
4. xcodeprojの設定
TARGETS → General → Frameworks,Libraries,and... → + → LoginPackage
5. 参照したいコードをPublicに変更
そのまま移動するだけでは参照できないので、ContentViewをPublicにします。
ContentView.swift Before
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
}
.padding()
}
}
#Preview {
ContentView()
}
ContentView.swift After
import SwiftUI
public struct ContentView: View { // ここ😌
public init() {} // ここ😌
public var body: some View { // ここ😌
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
}
.padding()
}
}
#Preview {
ContentView()
}
6. パッケージ外から参照
パッケージ外のMain.swiftからLoginPackageをimportしてContentViewを使用します。
Main.swift
import LoginPackage
import SwiftUI
@main
struct Main: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
さらに内包されているコードも参照可能
LoginPackage/Sub/SubContentView.swiftを追加して参照可能でした。
import LoginPackage
import SwiftUI
@main
struct Main: App {
var body: some Scene {
WindowGroup {
SubContentView()
}
}
}
今回参考にした記事
Discussion