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つのツールの特性を把握しておくと判断しやすくなります。

観点SwiftPMCocoaPodsCarthage
提供元Apple(Swift同梱)コミュニティコミュニティ
追加インストール不要gem install cocoapodsbrew 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 / AndroidiOS / 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パッケージを配置してモジュール分割する方法もあります。

  1. Xcodeのメニューから「File > New > Package…」を選択
  2. パッケージ名を入力し、プロジェクト内に配置
  3. アプリターゲットの「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-packagePackage.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 オプションには libraryexecutablesystem-modulemacro などを指定できます。

バージョン指定パターン

外部パッケージの依存を宣言する際、バージョンの指定方法を適切に選ぶことが安定運用の鍵になります。

// セマンティックバージョニング:メジャーバージョン固定(推奨)
.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対応状況を確認し、段階的に切り替えていくアプローチが実践的です。