いきなり、SPMパッケージを作り始めるのもあまりないと思いますので、プロジェクトから一部をSPMに抜き出す形での利用を想定します。
Sponsor Link
ベースとなるプロジェクトの作成
Xcode12 から MultiPlatform というプロジェクトを作ることができるようになりましたので、その設定で作ります。
プロジェクトの作成
名前は、ResourceSPM にしました。
共有リソース相当の作成
ここでは、関数を1つ作り、その関数が、SwiftPackage に保持されているイメージを返すとしました。
関数名は、SPMResource としました。
public func SPMResource(name: String) -> Image {
return Image(name)
}
そこで使われるリソースとなるイメージファイルも作成し追加しました。
Assets.xcassetsに追加しています。後で、SPM側のassetsに移行することを想定しています。
共有リソースを使うContentView.swift
共有リソースを使うようなViewを作成しました。
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Text("Image from SPM").padding()
SPMResource(name: "ImageFromSPM").resizable().scaledToFit()
}
}
}
SPMを使っていないアプリイメージ
以下のようなイメージになります。
ここで使われているイメージを Swift Package に移行することがゴールです。
Swift Package の作成/追加
プロジェクトにSwiftPackageを追加するために、新しいSwiftPackageを作成します。
Swift Packageの作成
まずは、新しくSwift Packageを作成します。
“SPMWithResource”という名前で作りました。作成中のプロジェクトに含めるようにします。
SPMWithResource パッケージ中の”Sources”フォルダが、共有するコードやリソースを配置するフォルダです。
共有コードの移行
共有するコードとして作った、”SPMResource.swift”を移動します。
ファイルのD&Dで簡単にできます。
共有リソースの移行
イメージを移行するためには、移行先に、Asset Catalogを新規で追加します。
Project Navigator上の右クリックで表示されるメニュー中の”New File”からダイアログを表示し、”Asset Catalog”を選択することで追加できます。
名称を、”Image”としました。
あとは、Assetの中の要素に対して、カット&ペーストを行うことで、新しく作成したAsset Catalogの中にイメージを移行させることができます。
サポートプラットフォームの明確化
SPMのリソースサポートは新しい機能ですので、サポートできるバージョンを追記しておきます。
Package.swiftに以下のように追記します。
let package = Package(
name: "SPMWithResource",
platforms: [ // NEW
.iOS(.v13) // NEW
], // NEW
products: [
// Products define the executables and libraries a package produces, and make them visible to other packages.
.library(
name: "SPMWithResource",
targets: ["SPMWithResource"]),
],
dependencies: [
...
packageを外部化する
Source Control Navigatorに移動すると以下のようになっているはずです。
Swift Packageとして、使用したいものは、下側の”SPMWithResource”ですので、こちらに対して、外部化します。
右クリックして表示される、New “SPMWithResource” remote を選択して、外部化します。
上記の実行後、右クリックで表示される”View on Github”を選択するとGithubのページへジャンプすることもできます。(後からこのURLが必要となります)
packageを参照する
上記で作成したURLを、プロジェクトが依存するSwiftPackageとして設定します。
いつもの、SwiftPackage管理画面で、”+”ボタンを押した後のフィールドに、先のURLをペーストして、リターンキーを押します。
今時点ではバージョン等を設定していないと思いますので、Branchのmainを選択します。 (Xcodeの表示するダイアログのデフォルトでは、masterとなっていますが、最近Githubのメインブランチをmasterからmainにする変更が入っていて、Xcodeはそれに追いついていないようです)
次に表示されるダイアログではターゲット等を設定しますが、特に変更することはなく、OKを押せば良いはずです。
packageをimportする
Pakcageを利用するコード側でpackageをimportする必要があります。
ですので、ContentViewに”import SPMWithResource”を追加します。
import SwiftUI
import SPMWithResource // NEW
struct ContentView: View {
var body: some View {
VStack {
Text("Image from SPM").padding()
SPMResource(name: "ImageFromSPM").resizable().scaledToFit()
}
}
}
ローカルのPackageから、リモートのPackageへ移行する
ローカルのPackageがプロジェクトに直接含まれている状態です。
変更する必要があれば、この状態で変更して、Packageをコミットしてプッシュすることで、Packageの内容をアップデートすることもできます。
Package内容のアップデートが不要になった段階で、プロジェクトからローカルのPackageを削除して、リモートのPackageを使うように設定変更するのがおすすめです。
こうすることで、プロジェクトでの作業で、意図せず、Packageを変更してしまうことを避けられます。
説明が多いですが、やることは簡単で、プロジェクト直下に見えているPackageのディレクトリを削除するだけです。
削除するために、すこしドキドキしますが、プロジェクトには、SPMの情報が設定されているので、以下のように自動的にリモートのパッケージを参照する形に切り替わります。
まとめ:プロジェクトの一部を Package に移行する4つのステップ
- プロジェクトを作成
- イメージファイル等のリソースを含めた一部をPackageに移行
- Packageをリモート化
- Packageに移行後、プロジェクト設定の変更
説明は以上です。
Sponsor Link