Skip to content

Swift Package Manager

Swift Package Manager 入門

1. Swift Package Manager (SPM) とは?

Swift Package Manager (SPM) は、Appleが開発したSwift言語用の公式パッケージマネージャーです。コードの依存関係を管理し、ビルドプロセスを自動化する役割を担います。

SPMの主な目的

  • 依存関係の管理: 外部ライブラリやフレームワークの自動ダウンロードと管理
  • ビルドの自動化: コンパイル、リンク、実行の一元管理
  • モジュールの組織化: コードをモジュール単位で整理し、再利用可能な形で提供

SPMを利用するメリット

  • 標準化: Swift言語の標準ツールとして、他のツールとの連携が容易
  • シンプルさ: 複雑な設定不要で、最小限のコードでパッケージを作成可能
  • バージョン管理: セマンティックバージョニングによる依存関係の適切な管理
  • クロスプラットフォーム: macOS、Linux、Windowsで動作
  • Xcodeとの連携: Xcodeプロジェクトでの直接利用が可能

2. 基本的な使い方

パッケージの作成

新しいSwiftパッケージを作成するには、swift package init コマンドを使用します:

Terminal window
# ライブラリパッケージの作成
swift package init
# 実行可能なパッケージの作成
swift package init --type executable
# 特定の名前でパッケージを作成
swift package init --name MyPackage

Package.swift(マニフェストファイル)

Package.swiftは、パッケージの設定を定義するマニフェストファイルです。基本的な構造は以下の通りです:

5.9
import PackageDescription
let package = Package(
name: "MyPackage",
platforms: [
.macOS(.v12),
.iOS(.v15)
],
products: [
.library(
name: "MyLibrary",
targets: ["MyLibrary"]
),
],
dependencies: [
.package(url: "https://github.com/apple/swift-algorithms", from: "1.0.0"),
],
targets: [
.target(
name: "MyLibrary",
dependencies: [
.product(name: "Algorithms", package: "swift-algorithms")
]
),
.testTarget(
name: "MyLibraryTests",
dependencies: ["MyLibrary"]
),
]
)

主要な設定項目

  • name: パッケージ名
  • platforms: 対応プラットフォームと最小バージョン
  • products: 生成されるライブラリや実行可能ファイル
  • dependencies: 外部パッケージの依存関係
  • targets: ソースコードの構成単位(ビルド対象)

基本コマンド

Terminal window
# パッケージのビルド
swift build
# 実行可能ファイルの実行
swift run
# テストの実行
swift test
# 依存関係の解決
swift package resolve
# パッケージ情報の表示
swift package describe

3. 依存関係の管理

外部パッケージの追加

外部パッケージを依存関係に追加するには、Package.swiftdependencies配列に追加します:

dependencies: [
// GitHub上のパッケージ
.package(url: "https://github.com/apple/swift-algorithms", from: "1.0.0"),
// 特定のバージョンを指定
.package(url: "https://github.com/apple/swift-collections", exact: "1.1.0"),
// バージョン範囲を指定
.package(url: "https://github.com/apple/swift-log", "1.0.0"..<"2.0.0"),
// ブランチを指定
.package(url: "https://github.com/example/package", branch: "main"),
// コミットを指定
.package(url: "https://github.com/example/package", revision: "abc123"),
]

バージョン指定の方法

SPMでは、セマンティックバージョニング(SemVer)に基づいた複数のバージョン指定方法があります:

  • from: "1.0.0": 指定したバージョン以上の最新版を使用
  • "1.0.0"..<"2.0.0": 範囲指定(1.0.0以上、2.0.0未満)
  • exact: "1.1.0": 特定のバージョンのみを使用
  • upToNextMajor(from: "1.0.0"): メジャーバージョンが変わらない範囲で最新版を使用
  • upToNextMinor(from: "1.1.0"): マイナーバージョンが変わらない範囲で最新版を使用
  • branch: "develop": 特定のブランチを使用
  • revision: "abc123": 特定のコミットを使用

依存関係の更新

Terminal window
# 依存関係を最新版に更新
swift package update
# 特定のパッケージのみ更新
swift package update PackageName
# 依存関係の解決のみ実行(更新はしない)
swift package resolve

Package.resolved ファイル

Package.resolvedファイルは、プロジェクトで使用している依存関係の正確なバージョンを記録します:

  • 目的: 再現可能なビルドを保証
  • 管理: Gitでバージョン管理に含める
  • 更新: swift package update時に自動更新
  • 内容: 各依存関係の正確なコミットハッシュとバージョン情報
{
"pins": [
{
"identity": "swift-algorithms",
"kind": "remoteSourceControl",
"location": "https://github.com/apple/swift-algorithms",
"state": {
"revision": "b14b7f4c528c942f121c8b860b9410b2bf57825e",
"version": "1.2.0"
}
}
]
}

4. Xcodeとの連携

XcodeプロジェクトでSPMパッケージを利用する

Xcode 11以降では、SPMパッケージを直接Xcodeプロジェクトに統合できます:

1. パッケージの追加

  1. Xcodeでプロジェクトを開く
  2. File > Add Package Dependencies… を選択
  3. パッケージのURLを入力(例:https://github.com/apple/swift-algorithms
  4. バージョン指定を選択:
    • Up to Next Major Version(推奨)
    • Up to Next Minor Version
    • Exact Version
    • Branch
    • Commit
  5. Add Packageをクリック
  6. 使用するプロダクトを選択してターゲットに追加

2. パッケージの使用

import Algorithms
struct ContentView: View {
let numbers = [1, 2, 3, 4, 5]
var body: some View {
VStack {
ForEach(numbers.chunked(into: 2), id: \.self) { chunk in
Text("\(chunk)")
}
}
}
}

3. パッケージの管理

  • パッケージの更新: Project Navigator の Package Dependencies で右クリック → Update Package
  • パッケージの削除: Project Navigator で削除したいパッケージを選択 → Delete

Swift Packageとしてのプロジェクト開発

Swift Packageは、Xcodeで直接開発できます:

Terminal window
# Swift Packageを作成
swift package init --type library --name MyAwesomeLibrary
# XcodeでPackage.swiftを開く
open Package.swift

Xcodeが自動的にSwift Packageとして認識し、以下の機能が利用できます:

  • コード補完
  • ビルド
  • テスト実行
  • デバッグ
  • ドキュメント生成

旧来の方法(参考情報)

注意: この方法はXcode 11以前の古い方法で、現在は推奨されません。

Terminal window
# Xcodeプロジェクトファイルを生成(非推奨)
swift package generate-xcodeproj

現在は、Package.swiftを直接Xcodeで開くことが推奨されています。

5. 発展的なトピック

ライブラリと実行可能ファイルの作成

ライブラリの作成

ライブラリは他のプロジェクトから利用可能なコードを提供します:

Package.swift
products: [
.library(
name: "MyLibrary",
targets: ["MyLibrary"]
),
]

実行可能ファイルの作成

実行可能ファイルは、直接実行できるプログラムを作成します:

Package.swift
products: [
.executable(
name: "MyCLITool",
targets: ["MyCLITool"]
),
]
targets: [
.executableTarget(
name: "MyCLITool",
dependencies: []
),
]
Sources/MyCLITool/main.swift
import Foundation
print("Hello, Swift Package Manager!")

リソース(画像、データファイルなど)の扱い

Swift 5.3以降では、パッケージにリソースファイルを含めることができます:

リソースの定義

Package.swift
targets: [
.target(
name: "MyLibrary",
dependencies: [],
resources: [
// 特定のファイルを指定
.process("Resources/config.json"),
// ディレクトリ全体をコピー
.copy("Assets"),
// パターンマッチングでファイルを指定
.process("Data", localization: .base),
]
),
]

リソースの利用

import Foundation
// リソースファイルへのアクセス
guard let resourceURL = Bundle.module.url(forResource: "config", withExtension: "json") else {
fatalError("設定ファイルが見つかりません")
}
let data = try Data(contentsOf: resourceURL)
let config = try JSONDecoder().decode(Config.self, from: data)

ディレクトリ構造の例

MyPackage/
├── Package.swift
├── Sources/
│ └── MyLibrary/
│ ├── MyLibrary.swift
│ ├── Resources/
│ │ └── config.json
│ └── Assets/
│ ├── icon.png
│ └── data.txt
└── Tests/
└── MyLibraryTests/
└── MyLibraryTests.swift

プラグインの利用

Swift 5.6以降では、ビルドプロセスを拡張するプラグインが利用できます:

コマンドプラグイン

Package.swift
targets: [
.plugin(
name: "MyCodeGenPlugin",
capability: .command(
intent: .custom(verb: "generate-code", description: "Generate Swift code"),
permissions: [
.writeToPackageDirectory(reason: "Generate source files")
]
)
),
]

ビルドツールプラグイン

Package.swift
targets: [
.target(
name: "MyLibrary",
dependencies: [],
plugins: ["SwiftProtobuf"]
),
]

プラグインの実行:

Terminal window
# コマンドプラグインの実行
swift package plugin generate-code
# 利用可能なプラグインの確認
swift package plugin --list