【Xcode】Swift Package Managerの使い方!パッケージ導入管理ツール
この記事からわかること
- Swift Package Managerとは?
- XcodeからSwift Package Managerを操作する方法
- パッケージ管理ツールの導入
- パッケージとライブラリの違いと役割
- 対応しているライブラリの見分け方
- パッケージの追加や編集、削除するには?
- Package.swiftやPackage.resolvedとは?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Swift Package Managerとは?
公式リファレンス:GitHub-swift-package-manager
「Swift Package Manager」とはiOSやmacOSアプリを開発時に使用されるApple製でオープンソースなパッケージ管理ツールです。外部に公開されているさまざまなパッケージ(ライブラリ)依存関係を保ちつつインストールや更新、削除することが可能になっています。
リリース当初はコマンドラインからの操作のみしかできずmacOSやLinuxなどで開発するアプリでの使用に限られていましたがXcode11以降からXcodeに組み込まれるようになりiOSアプリ開発にも使用できるようになりました。
iOSアプリ開発における似たような依存関係管理ツールとして「Carthage」や「Cocoa Pods」などがあります。
Swift Package Managerの特徴と違い
複数存在する依存関係管理ツールの中でもSwift Package Managerは以下のような特徴と違いを持っています。
- Xcodeから操作可能
- 対応ライブラリは少なめ
- Apple製
- 導入が簡単
Swift Package Managerは他のツールに比べて対応しているライブラリの種類はあまり多くはありませんがApple純正の管理ツールであり、依存関係を把握しやすく、導入も簡単なのが大きなメリットです。
パッケージとライブラリの違いとは?
混在しがちなパッケージとライブラリの違いを自分なりに整理しておきます。まずは広義の意味でのパッケージとライブラリについてです。(間違ってたら教えてください)
- パッケージ:複数のライブラリなどのリソースをまとめたもの
- ライブラリ:再利用可能なコードの集まり
パッケージ
パッケージとはコード、リソース、テスト、ビルド設定など複数のモジュールを含む集合体。パッケージの中に複数のライブラリがまとめられていたりすることもある。
ライブラリ
ライブラリは再利用可能なコードの集合体。Swiftには標準ライブラリやサードパーティ製のライブラリがある。
SPMにおけるパッケージ
Swift Package ManagerにおけるパッケージはライブラリなどをSPMで導入できるようにした配布形態のことです。実態としては決まった形式のファイル群であり、Gitリポジトリとして提供されいていることが多いです。
パッケージのルートディレクトリには¥「Package.swift」、「Sourcesディレクトリ」、「Testsディレクトリ」などを用意する必要があります。
パーケージ例
├── example-package-playingcard
│ ├── Sources
│ └── PlayingCard
│ ├── PlayingCard.swift
│ ├── Rank.swift
│ └── Suit.swift
│ ├── Tests
│ ├── 以下省略
│ ├── .gitignore
│ ├── CONTRIBUTING.md
│ ├── LICENSE.txt
│ ├── Package.swift
│ └── README.md
引用: GitHub-Example package for use with the Swift Package Manager
パッケージは開発者が自作することも可能なので、オリジナルのライブラリを公開しておけば簡単に導入、管理することができるようになります。
// オリジナルライブラリパッケージ作成コマンド
$ swift package init --name パッケージ名 --type library
対応しているライブラリの見分け方
ライブラリがSPMに対応しているかどうかを識別するには「Package.swift」があるかないかを確認します。
例えばクラスプラットフォームモバイルデータベースである「Realm」を見てみるとルートディレクトリに「Package.swift」 があるのでSPMに対応していることが確認できます。
Package.swiftとは?
肝となっている「Package.swift」ファイルはマニフェストファイルとも呼ばれ、プロジェクトの依存関係、ターゲット、およびその他のプロジェクト設定が記述されているファイルです。Swift Package Managerではこのファイルを解析することで依存関係を特定します。
空の「Package.swift」は以下のコマンドを使用して作成することができます。
$ swift package init
iOSアプリ開発におけるパッケージの導入方法
Swift Package ManagerはXcodeから使用できるようになっているのでSPM自体を導入する手順は必要ありません。実際にパッケージをインストールしてみます。
上部のメニューから「File」>「Add Packages...」をクリックします。
表示された画面の中から使用したいパッケージを選択します。左メニューは「Recently Used(最近使用)」、「Apple Swift Packages」、「GitHub」の3つに分かれており、「GitHub」をクリック後に右上部の入力欄にリポジトリのURLを直接入力することで指定可能です。今回は先ほどのhttps://github.com/apple/example-package-playingcard
を入力してみます。
正しいURLを入力すると画像のように対象のパッケージが表示されるのでDependency Rule(依存性ルール)とプロジェクト先を指定します。例えばDependency Rule(依存性ルール)に「Up to Next Major Version」を選択した画像の場合は3.0.0<4.0.0
の間なら許容されることになります。パッケージのバージョニングは「セマンティックバージョニング:X.Y.Z
」に倣っているので「メジャー.マイナー.パッチ」の順になります。「Add Package」をクリックして次の画面に遷移します。
パーケージを使用したいプロジェクト内のターゲットを選択し「Add Package」をクリックすることでパッケージの追加が開始されます。
正常に追加が完了するとXcodeのナビゲータエリアに「Package Dependencies」が追加され、そこから追加されたパッケージを参照することができるようになります。
あとは使用したい箇所でimport
するだけです。
import PlayingCard
パッケージの操作
iOSプロジェクトに組み込まれたパッケージを操作するためには上部メニューから「File」>「Packages」に用意されているメニューから実行可能です。
- Reset Package Caches:リセット
- Resolve Package Versions:依存関係を解決
- Update to Latest Package Versions:更新
よく使用する「Update to Latest Package Versions」はCocoaPodsでいうpod update
と同じだと思います。
パッケージの編集・削除
パッケージの編集や削除は「プロジェクト」>「Package Dependencies」から実行することが可能になっています。
パッケージ追加後に生成されるファイル
Swift Package Managerを使用してパッケージを追加した後には様々なファイルが自動生成されます。追加したパッケージの実態(コード群)や設定ファイルなどがどこに保存されているのか見ておきます。
- 実際のパッケージファイル群
- Package.resolved
実際のパッケージファイル群
追加されたパッケージは「DerivedData」内にプロジェクトごとに以下のようなパスで追加されます。
~/Library/Developer/Xcode/DerivedData/[プロジェクト名]-ID/SourcePackages/checkouts/[パッケージ名]
Package.resolved
「Package.resolved」はSwiftパッケージの依存関係の解決に使用される設定ファイルです。例えばアップデートが実行された際はすべてのパッケージの依存関係の解決を完了した後、Package.resolvedに解決された依存関係のリストを保存します。これにより開発者が将来プロジェクトを再ビルドする場合、同じバージョンのパッケージが再度インストールされることが保証されます。
生成される場所は以下の通りです。
$ find ../ -name "Package.resolved"
..//Desktop/Test/Test.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
エラー:Missing Package Product パッケージ名 File
SPMを使用していると以下のようなエラーが発生することがあります。
Missing Package Product パッケージ名 File
このエラーは対象のパッケージが見つからない場合に発生します。単純にSPMでパッケージが導入できていないため、Xcode上部メニューの「File」>「Packages」>「Reset Package Caches」をクリックするとキャッシュをリセットすることができるので再度ビルドすることでパッケージが再度取得開始されエラーを解消することができます。
そのためこのエラーはDerivedDataなどを削除すると発生することがあるので注意してください。
ご覧いただきありがとうございました。