Swift Package中心のプロジェクト構成とその実践を試してみる

はじめに

2021年のiOSDCでSwift Package中心のプロジェクト構成とその実践という内容でトークが公開されていたので、それを参考にSwift Package中心のプロジェクト構成を試してみました。

導入

1. Workspaceの追加

WorkSpaceを追加してプロジェクトを管理していきます、適当なフォルダの中にWorkSpaceを追加

2. WorkSpaceにプロジェクトを追加する

管理したい.xcodeprojファイルをドラックアンドドロップでworkspaceに追加します、今回はHogeAppというプロジェクトを追加しました。

自分のプロジェクトがすでにある場合はそれを使ってOKです

  • プロジェクトフォルダ全てではなく.xcodeprojを追加するので注意

3.モジュールの追加

Fire -> New -> Packageから新しいModuleを追加します

作成する際にモジュールが追加できたらAdd toのところにWorkSpaceを指定すると作成した際にWorkSpaceでModuleの中身を確認できるようになります。

この時点でWorkSpace内はこんな感じ

Moduleの中にPackage.swiftというファイルがありますがざっくり3つの項目で構成されています。
Products
パッケージから生成するものを定義、デフォルトでは自分で作成したLibraryが追加されていると思います。


Dependencies
サードパーティーのライブラリを定義

Targets
サブディレクトリ1つ1つがモジュールとして認識されるのでデフォルトでは追加したモジュールとテストが入っていると思います。

プロジェクトのファイルを自作モジュールに移動させる

まずは自作のモジュールをimportできるようにHopgAppのFrameworks, Libraries, and Embedded Contentの部分でリンクを追加します。

リンクを正しく行えているとプロジェクト内からモジュールがimport可能になっているはずです。

次にプロジェクトのファイルをモジュール側に移動させていきます。

SwiftUIのプロジェクトとを作成した時に自動生成されるContentViewをモジュール側に移動させました。注意点として参照できるように修飾子をpublic指定に変える必要があります。

public struct ContentView: View {
    public var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            Text("Hello, world!")
        }
        .padding()
    }

    public init() {}
}

そのままだとサポートしているversionを明記しておらずコンパイラに怒られるのでmoduleのPackage.swiftにplatformsを追加してさぽーとするversionを記述します。

let package = Package(
    name: "MyLibrary",
    platforms: [
        .iOS(.v16)
    ],
    products: [

これでプロジェクト側からmodule内に定義されたContentViewを呼び出すことができるようになっているはずです。

import SwiftUI
import MyLibrary


@main
struct HogeAppApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}