✈️

SwiftPMでローカルコードのパッケージ化手順

2025/01/04に公開

本記事の内容

SwiftPM(SPM)は大体以下2つの目的で利用しますが、この記事では2つ目のローカル実装のパッケージ管理を行う際の手順を説明します。

参考にした記事は最後に記載しています

  1. ライブラリ管理
  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にドラッグ&ドロップ

LoginPackageAppプロジェクト直下にドラッグ&ドロップします。

Xcodeが認識しないので、LoginPackageAppと同じディレクトリに移動しています。


Finishします。

ドラッグ&ドロップ後

3. Package.swift更新

試しにContentView.swiftLoginPackageに移動してパッケージ外から参照できるようにします。

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の設定

TARGETSGeneralFrameworks,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()
        }
    }
}

今回参考にした記事

https://qiita.com/Soccerboy_Hamada/items/50570c7ad937fc9a5281
https://zenn.dev/kalupas226/articles/73118709e316ad
https://zenn.dev/ruwatana/articles/b8b54cb79169a2

Discussion