Swift Package Manager(SwiftPM)はApple公式の依存管理ツール
Swift Package Manager(以下SwiftPM)は、Swiftプロジェクトで利用する外部ライブラリやモジュールの取得・ビルド・リンクを一括で処理するApple純正のパッケージ管理ツールです。Swiftツールチェインに同梱されているため、追加インストールなしで利用を開始できます。
2024年8月、長年iOSエコシステムを支えてきたCocoaPodsがメンテナンスモードへの移行を公式発表しました(出典: CocoaPods Blog)。trunk(パッケージレジストリ)は2026年12月に読み取り専用へ切り替わる予定です(出典: CocoaPods Blog)。SwiftPMは今後のiOS/macOS開発における標準のパッケージ管理手段として、その重要度がさらに高まっています。
CocoaPods・Carthage・SwiftPMの違い
パッケージマネージャーを選定する際、3つのツールの特性を把握しておくと判断しやすくなります。
| 観点 | SwiftPM | CocoaPods | Carthage |
|---|---|---|---|
| 提供元 | Apple(Swift同梱) | コミュニティ | コミュニティ |
| 追加インストール | 不要 | gem install cocoapods | brew install carthage |
| 設定ファイル | Package.swift(Swift DSL) | Podfile(Ruby DSL) | Cartfile(独自書式) |
| ビルド統合 | Xcode標準対応 | .xcworkspace を生成 | フレームワークを手動リンク |
| バイナリ配布 | XCFramework対応 | 対応 | XCFramework対応 |
| プラグイン機構 | Build Tool Plugin / Command Plugin | 非対応 | 非対応 |
| Objective-C対応 | modulemap併用で可能 | ネイティブ対応 | フレームワーク経由で対応 |
| 開発状況(2025年) | 活発に開発中 | メンテナンスモード | 低頻度の更新 |
| クロスプラットフォーム | iOS / macOS / Linux / Windows / Android | iOS / macOS のみ | iOS / macOS のみ |
| レジストリ | Swift Package Index(10,000パッケージ超) | CocoaPods Trunk(2026年12月に読み取り専用化予定) | なし(GitHubリポジトリ直接指定) |
CocoaPodsからSwiftPMへ移行する場合、Podfile に記載されていた各ライブラリがSPM対応済みかどうかを事前に確認してください。Swift Package Index(https://swiftpackageindex.com)で検索すると、SPM対応状況や対応プラットフォームをすぐに把握できます。
Package.swiftの構造と書き方
SwiftPMではプロジェクトのルートに配置する Package.swift がマニフェストファイルとして機能します。依存関係・ターゲット構成・対応プラットフォームなどを宣言的に記述します。
// swift-tools-version: 6.0
import PackageDescription
let package = Package(
name: "MyApp",
platforms: [
.iOS(.v16),
.macOS(.v13)
],
products: [
.library(
name: "MyLibrary",
targets: ["MyLibrary"]
),
.executable(
name: "MyCLI",
targets: ["MyCLI"]
)
],
dependencies: [
.package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.9.0"),
.package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.3.0")
],
targets: [
.target(
name: "MyLibrary",
dependencies: ["Alamofire"]
),
.executableTarget(
name: "MyCLI",
dependencies: [
"MyLibrary",
.product(name: "ArgumentParser", package: "swift-argument-parser")
]
),
.testTarget(
name: "MyLibraryTests",
dependencies: ["MyLibrary"]
)
]
)
各プロパティの役割
| プロパティ | 説明 |
|---|---|
swift-tools-version | ファイル先頭のコメントで指定。利用するSwiftPM APIのバージョンを宣言 |
name | パッケージ名。他パッケージから参照する際の識別子 |
platforms | 対応プラットフォームと最小バージョン |
products | パッケージが外部へ公開するライブラリや実行ファイル |
dependencies | 外部パッケージへの依存を記述 |
targets | ソースコードをまとめる単位。ターゲット間で依存関係を定義可能 |
swift-tools-version は非常に重要です。この値によって利用可能なAPIや言語機能が変わります。Swift 6.0以降では、ターゲット単位で swiftLanguageMode を指定して段階的にSwift 6の厳密な並行処理チェックを適用できます。
SwiftPMの基本概念を整理する
SwiftPMを使いこなすには、5つの概念の関係性を押さえておく必要があります。
Package(パッケージ)
SwiftPMにおける最上位の単位です。ソースコード群と Package.swift マニフェストから構成されます。1つのパッケージは1つ以上のターゲットを含みます。
Target(ターゲット)
ソースコードをグループ化する単位で、名前空間としても機能します。public 修飾子を付与したシンボルだけが外部から参照可能になります。ターゲット同士は依存関係を持てますが、循環参照は許可されません。
ターゲットの種類は以下のとおりです。
| ターゲット型 | 用途 |
|---|---|
.target() | ライブラリモジュールのソースコードを格納 |
.executableTarget() | コマンドラインツールなど実行ファイルのエントリポイントを含む |
.testTarget() | XCTest / swift-testingベースのテストコードを格納 |
.binaryTarget() | プリビルト済みXCFrameworkの取り込み |
.macro() | Swiftマクロの実装(Swift 5.9以降) |
.plugin() | ビルドツール / コマンドプラグイン(Swift 5.6以降) |
.systemLibrary() | pkg-configベースのシステムライブラリラッパー |
Product(プロダクト)
パッケージが外部に公開する成果物を定義します。他のパッケージからインポートできるのは、Product として宣言されたもののみです。
- library: ライブラリとして提供。static / dynamic を選択可能(省略時はSwiftPMが自動判断)
- executable: コマンドラインツールなどの実行ファイル
- plugin: ビルドツールプラグインやコマンドプラグイン
Dependency(依存関係)
外部パッケージやターゲット間の依存を表します。依存関係はツリー構造を形成し、循環は禁止されています。SwiftPMは依存グラフを解析し、必要なパッケージを自動で取得・ビルドします。
Module(モジュール)
import 文で読み込む単位です。SwiftPMにおけるターゲットがそのままモジュールに対応します。1ターゲット=1モジュールの関係です。
Xcodeからの導入手順
Xcode上でSwiftPMパッケージを追加する手順は以下のとおりです。
手順1: Xcodeでプロジェクトを開き、メニューバーから「File > Add Package Dependencies…」を選択します。
手順2: 検索バーにパッケージのGitリポジトリURLを入力します(例: https://github.com/Alamofire/Alamofire.git)。
手順3: バージョンルール(Up to Next Major Version、Exact Version など)を選択し、「Add Package」をクリックします。
手順4: 追加するライブラリプロダクトを選び、リンク先のターゲットを指定します。
追加されたパッケージはプロジェクトナビゲーターの「Package Dependencies」セクションに表示されます。依存関係の解決状態は Package.resolved ファイルに記録されます。
ローカルパッケージを使う方法
プロジェクト内にSwiftPMパッケージを配置してモジュール分割する方法もあります。
- Xcodeのメニューから「File > New > Package…」を選択
- パッケージ名を入力し、プロジェクト内に配置
- アプリターゲットの「General > Frameworks, Libraries, and Embedded Content」でモジュールを追加
ローカルパッケージを使うメリットは、依存変更がPackage.swiftに集約されるため .xcodeproj のdiff が読みやすくなる点です。マルチモジュール構成のアプリ設計で広く採用されています。
CLIでの操作コマンド一覧
SwiftPMはターミナルからも操作できます。Xcodeを使わずにサーバーサイドSwiftやCLIツールを開発する場合に活用します。
| コマンド | 説明 |
|---|---|
swift package init --type library | ライブラリパッケージの雛形を生成 |
swift package init --type executable | 実行可能パッケージの雛形を生成 |
swift build | パッケージをビルド |
swift build -c release | リリースビルド(最適化有効) |
swift test | テストターゲットを実行 |
swift test --parallel | テストを並列実行 |
swift run | 実行可能ターゲットを起動 |
swift run TargetName | 指定した実行可能ターゲットを起動 |
swift package resolve | 依存関係を解決してPackage.resolvedを更新 |
swift package update | 全依存パッケージを最新バージョンに更新 |
swift package show-dependencies | 依存ツリーを表示 |
swift package show-dependencies --format json | 依存ツリーをJSON形式で出力 |
swift package reset | ビルド成果物とキャッシュを削除 |
swift package clean | ビルド成果物を削除 |
swift package dump-package | Package.swiftの内容をJSON形式でダンプ |
swift package edit PackageName | 依存パッケージを編集モードに切り替え |
swift package unedit PackageName | 編集モードを終了 |
swift package plugin | プラグインを実行 |
swift package info | パッケージの概要情報を表示(Swift 6.1〜) |
swift package compute-checksum File.zip | バイナリターゲット用のチェックサムを算出 |
--type オプションには library、executable、system-module、macro などを指定できます。
バージョン指定パターン
外部パッケージの依存を宣言する際、バージョンの指定方法を適切に選ぶことが安定運用の鍵になります。
// セマンティックバージョニング:メジャーバージョン固定(推奨)
.package(url: "https://github.com/example/lib.git", from: "2.0.0")
// → 2.0.0 以上 3.0.0 未満
// 範囲指定
.package(url: "https://github.com/example/lib.git", "1.2.0"..<"1.5.0")
// 完全一致
.package(url: "https://github.com/example/lib.git", exact: "3.1.2")
// ブランチ指定(開発中のみ推奨)
.package(url: "https://github.com/example/lib.git", branch: "develop")
// コミットハッシュ指定
.package(url: "https://github.com/example/lib.git", revision: "a1b2c3d4e5f6")
本番環境では from: によるセマンティックバージョニングが最も推奨されます。branch: や revision: は開発段階の一時的な利用にとどめ、リリース前には安定バージョンへ切り替えてください。
Package.resolvedの役割
依存解決の結果は Package.resolved ファイルに記録されます。このファイルをGitリポジトリにコミットすることで、チーム全員が同じバージョンの依存パッケージを使用できます。
- アプリプロジェクト →
Package.resolvedをコミットする(ビルドの再現性を担保) - ライブラリパッケージ →
.gitignoreに追加する(利用側のバージョン解決を妨げないため)
プラグイン機能
SwiftPMにはSwift 5.6以降で導入されたプラグイン機構があり、ビルドプロセスやワークフローを拡張できます。
Build Tool Plugin
ビルド時に自動実行されるプラグインです。コード生成やリソース変換に使用します。
- 用途例: Protocol Buffersからのコード生成、SwiftGenによるリソースアクセサ生成
- 定義方法:
.plugin(capability: .buildTool())としてターゲットを定義
Command Plugin
開発者が手動で実行するプラグインです。コードフォーマッターやリントツールの実行に使います。
- 用途例: SwiftLintの実行、ドキュメント生成、コードフォーマット
- 定義方法:
.plugin(capability: .command(...))としてターゲットを定義 - 実行方法:
swift package plugin PluginNameまたはXcodeの右クリックメニューから実行
// プラグインターゲットの定義例
.plugin(
name: "MyCodeGen",
capability: .buildTool(),
dependencies: ["CodeGenTool"]
)
Objective-Cコードとの混在
既存のObjective-CプロジェクトにSwiftPMパッケージを導入するケースや、Objective-Cで書かれたライブラリをSwiftPMで配布するケースがあります。
Objective-CライブラリをSwiftPMで配布する
Objective-CのソースコードをSwiftPMパッケージとして配布するには、Sources/ターゲット名/include/ ディレクトリに公開ヘッダーを配置します。
Sources/
MyObjCLib/
include/
MyObjCLib.h
MyObjCLib.m
Package.swiftではCのターゲットとして定義します。
.target(
name: "MyObjCLib",
path: "Sources/MyObjCLib",
publicHeadersPath: "include"
)
XCFrameworkのバイナリ配布
ビルド済みフレームワークを配布する場合は binaryTarget を使います。
.binaryTarget(
name: "MyFramework",
url: "https://example.com/MyFramework.xcframework.zip",
checksum: "abc123..."
)
チェックサムは swift package compute-checksum MyFramework.xcframework.zip で算出できます。
よくあるトラブルと対処法
SwiftPMの導入・運用で遭遇しやすい問題と解決策をまとめます。
パッケージの取得が失敗する
症状: 「Failed to resolve dependencies」や「Package resolution failed」と表示される。
対処法:
- Xcodeの「File > Packages > Reset Package Caches」を実行
~/Library/Caches/org.swift.swiftpmを削除して再試行- プライベートリポジトリの場合、SSH鍵の設定を確認(Xcodeはデフォルトでシステムのgit認証を使用)
Package.resolvedの競合
症状: チームメンバー間で Package.resolved のgitコンフリクトが頻発する。
対処法:
- コンフリクト発生時は一方の変更を採用後、
swift package resolveを実行 - CIでは
swift package resolveをビルド前に実行するステップを追加
ビルド時間が長い
症状: 依存パッケージが増えるにつれてビルド時間が伸びる。
対処法:
- 不要な依存を定期的に整理する
- 大きなライブラリはXCFrameworkとして
binaryTargetで取り込む swift build --jobs Nでビルドの並列数を明示的に指定
Xcodeでパッケージが見つからない
症状: Xcodeのパッケージ検索でリポジトリがヒットしない。
対処法:
- リポジトリURLを直接入力する(検索機能はSwift Package Indexに依存)
- プライベートリポジトリの場合はURLを手入力
Swift 6時代のSwiftPM最新動向
Swift 6の並行処理チェックとSwiftPM
Swift 6.0(2024年9月、Xcode 16同梱)では、厳密な並行処理安全性チェックがデフォルトで有効になりました。swift-tools-version: 6.0 以降では、ターゲット単位で swiftLanguageMode を設定して段階的に移行できます。
.target(
name: "MyLibrary",
dependencies: [],
swiftSettings: [
.swiftLanguageMode(.v5) // Swift 5モードを維持
]
)
Package Traits(Swift 6.1〜)
Swift 6.1で導入されたPackage Traitsは、パッケージが提供する機能セットを条件付きで切り替える仕組みです。Embedded SwiftやWebAssemblyなど、異なる実行環境向けのオプション依存や条件付きコンパイルを表現できます。
Swift 6.2のSwiftPM改善(2025年9月)
Swift 6.2ではマクロを利用するプロジェクトのビルド高速化が実現しました。swift-syntaxのプリビルト依存が導入され、クリーンビルド時にswift-syntaxをソースからコンパイルする必要がなくなっています。また、treatWarning() や treatAllWarnings() メソッドによる診断グループ単位での警告制御も追加されました(出典: Swift.org)。
Swift Buildのオープンソース化(2025年2月)
AppleはXcodeの内部ビルドエンジンであるSwift Buildを2025年2月にオープンソース化しました(出典: Swift.org)。SwiftPMは --build-system swiftbuild フラグで新ビルドエンジンを利用可能で、将来的にはSwiftPMとXcodeのビルド挙動が統一される計画です。Apple platforms、Linux、Windows、Android、QNXなどのクロスプラットフォームビルドに対応しています。
Package.swiftのディレクトリ構成規約
SwiftPMはディレクトリ構成に規約があります。規約に従うことで path パラメータの明示的な指定を省略できます。
MyPackage/
├── Package.swift
├── Package.resolved
├── Sources/
│ ├── MyLibrary/
│ │ ├── MyLibrary.swift
│ │ └── Helpers/
│ │ └── Utils.swift
│ └── MyCLI/
│ └── main.swift
├── Tests/
│ └── MyLibraryTests/
│ └── MyLibraryTests.swift
└── Plugins/
└── MyPlugin/
└── plugin.swift
Sources/ターゲット名/にソースコードを配置Tests/ターゲット名Tests/にテストコードを配置Plugins/プラグイン名/にプラグインコードを配置
リソースファイル(画像・JSON・xibなど)を含める場合は、ターゲット定義で resources パラメータを指定します。
.target(
name: "MyLibrary",
dependencies: [],
resources: [
.process("Resources"), // ビルド時にプラットフォーム最適化
.copy("Data") // そのままコピー
]
)
まとめ
Swift Package ManagerはSwiftツールチェイン標準のパッケージ管理ツールで、CocoaPodsのメンテナンスモード移行を受けて、iOS/macOS開発における依存管理の主流となっています。Package.swiftによる宣言的な構成管理、Xcodeとの緊密な統合、プラグインによる拡張性が主な利点です。
SPM対応パッケージの検索には Swift Package Index が便利です。既存プロジェクトからの移行を検討している場合は、まず利用中のライブラリのSPM対応状況を確認し、段階的に切り替えていくアプローチが実践的です。
