[SwiftPM] Swift Package Manager にリソースを追加してプロジェクトから使うまでのステップを説明

SwiftPackageManagerEyeCatch

Swift Package Manager がコードだけでなく、リソース等を保持できるようになったので、プロジェクトからどのように使うかを説明します。

いきなり、SPMパッケージを作り始めるのもあまりないと思いますので、プロジェクトから一部をSPMに抜き出す形での利用を想定します。

ベースとなるプロジェクトの作成

Xcode12 から MultiPlatform というプロジェクトを作ることができるようになりましたので、その設定で作ります。

プロジェクトの作成

名前は、ResourceSPM にしました。

共有リソース相当の作成

ここでは、関数を1つ作り、その関数が、SwiftPackage に保持されているイメージを返すとしました。

関数名は、SPMResource としました。

SPMResource.swift

public func SPMResource(name: String) -> Image {
    return Image(name)
}

そこで使われるリソースとなるイメージファイルも作成し追加しました。

ImageResourceInSPM

Assets.xcassetsに追加しています。後で、SPM側のassetsに移行することを想定しています。

共有リソースを使うContentView.swift

共有リソースを使うようなViewを作成しました。

ContentView.swift

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Image from SPM").padding()
            SPMResource(name: "ImageFromSPM").resizable().scaledToFit()
        }
    }
}

SPMを使っていないアプリイメージ

以下のようなイメージになります。

AppImageWithoutSPM

ここで使われているイメージを Swift Package に移行することがゴールです。

Swift Package の作成/追加

プロジェクトにSwiftPackageを追加するために、新しいSwiftPackageを作成します。

Swift Packageの作成

まずは、新しくSwift Packageを作成します。

"SPMWithResource"という名前で作りました。作成中のプロジェクトに含めるようにします。

IntoProject
作成すると以下のようになります。

ProjectDirectory

SPMWithResource パッケージ中の"Sources"フォルダが、共有するコードやリソースを配置するフォルダです。

共有コードの移行

共有するコードとして作った、"SPMResource.swift"を移動します。
ファイルのD&Dで簡単にできます。

FileMovedForSPM

共有リソースの移行

イメージを移行するためには、移行先に、Asset Catalogを新規で追加します。
Project Navigator上の右クリックで表示されるメニュー中の”New File"からダイアログを表示し、”Asset Catalog"を選択することで追加できます。
名称を、"Image"としました。

AddedAssets

あとは、Assetの中の要素に対して、カット&ペーストを行うことで、新しく作成したAsset Catalogの中にイメージを移行させることができます。

MovedImage

サポートプラットフォームの明確化

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に移動すると以下のようになっているはずです。

SCN

Swift Packageとして、使用したいものは、下側の"SPMWithResource"ですので、こちらに対して、外部化します。

右クリックして表示される、New "SPMWithResource" remote を選択して、外部化します。

上記の実行後、右クリックで表示される"View on Github"を選択するとGithubのページへジャンプすることもできます。(後からこのURLが必要となります)

packageを参照する

上記で作成したURLを、プロジェクトが依存するSwiftPackageとして設定します。

AddSPM

いつもの、SwiftPackage管理画面で、”+”ボタンを押した後のフィールドに、先のURLをペーストして、リターンキーを押します。

selectBranch

今時点ではバージョン等を設定していないと思いますので、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の情報が設定されているので、以下のように自動的にリモートのパッケージを参照する形に切り替わります。

refertoRemote




まとめ:プロジェクトの一部を Package に移行する4つのステップ

プロジェクトの一部を Package に移行する4つのステップ
以下の手順に分けて説明しました。

  • プロジェクトを作成
  • イメージファイル等のリソースを含めた一部をPackageに移行
  • Packageをリモート化
  • Packageに移行後、プロジェクト設定の変更

説明は以上です。




コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です