Swift Package Manager
#SwiftPM #SPM
概要
Swift コード配布のためのツール
Swift 自体に組み込まれている
Swift ビルトシステムと連携して、ソースの DL、コンパイル、リンク等を自動的に行う
プラットフォーム非依存
Xcode と統合されているため、様々な操作が容易に行える
クイックヘルプが見られるようになるのも良いところ
Xcode 上で直接ライブラリのコードを書き換えてビルドしたりもできる
まるでビルトインの API のようなサポートを得ることができる
SwiftPM によるマルチモジュール構成のメリット
コンパイル時間の短縮
コンパイルやリンクはモジュール毎に行われる
モジュールに変更がなければコンパイルは走らない
Xcode Preview の安定化
Mini-Application を作りやすい
機能 Module を作って利用する
概念
Swift Package の構成
Swift Package は、マニフェストを含む単純なディレクトリ。マニフェストがそのディレクトリを Swift Package として定義する。
Sources と Tests を含む。Sources 配下にはサブディレクトリを配置でき、個別にビルド可能。
基本的には、以下の 3 つから構成される。
Targets
個別にビルドできるもの
Sources 配下のサブディレクトリと 1:1 対応する
Products
パッケージがパッケージ利用者に利用できるプロダクトを定義する
クライアントがインポートできるコードを制御できる
Target を export する
Dependencies
Manifest
SwiftPM のマニフェストは、Swift で記述できる。Manifest であるソースコードが評価される頻度やタイミングについて保証しないため、宣言的に記述することが推奨されている。例えば、変数に値を入れてそれを使い回すようなことは避け、常に文字列定数を指定するのが良いとされる。
Build System
llbuild と呼ばれるビルドエンジンを利用している。ビルドシステムのためのライブラリであり、Xcode の New Build System でも利用されている。Swift OSS プロジェクトの内の 1 つでもある。
使い方
パッケージを作成する
code:console
$ mkdir ./my-package
$ cd my-package
$ swift package init --type executable
$
依存関係解決
Local Package
Xcode workspace 内のサブプロジェクトと同様のものと考えられる
プラットフォーム非依存
Xcode が必要に応じて自動でビルドしてくれるため
共有コードの分離ができる
バージョン指定が不要
準備が整えば簡単に公開できる
File > New > Swift Package から生成可能
パッケージのビルドには xcodebuild も使える
Package Collections
モチベーション
たくさんのライブラリがあるので、便利に検索したい
パッケージ利用時にはライセンス等のメタデータも閲覧したい
Package Collections は、厳選されたライブラリのリストのようなものらしい
Xcode 上でライブラリを検索したり、情報を閲覧するのに便利
実態は JSON ファイルであり、HTTPS で配信される
ユースケース
企業で、Collection に含まれた信頼できるパッケージに利用を限定することなどができる
教育者が、講義内容にあった Collection をパブリッシュできる
開発者がライブラリの選定には気を配らず、開発に集中できるようにする
リソースの取り扱い
https://developer.apple.com/documentation/swift_packages/bundling_resources_with_a_swift_package
Binary Depndency
参考
Getting to Know Swift Package Manager - WWDC 2018
Adopting Swift Packages in Xcode - WWDC 2019
Creating Swift Packages - WWDC 2019
Swift packages: Resources and localization - WWDC 2020
Distribute binary frameworks as Swift packages - WWDC 2020
Discover and curate Swift Packages using Collections - WWDC 2020
Swift.org - Package Manager
CI で利用する
Building Swift Packages or Apps that Use Them in Continuous Integration Workflows - Apple Developer
https://qiita.com/ykkd/items/5d2faeaacceddcf96acc