📦

SwiftPMでiOSプロジェクトを構成してみる

4 min read

概要

2021年4月22日のSwift愛好会にて、d_dateさんが「Swift PM centered iOS Development」というタイトルで発表いただいた談義が興味深く、自分でも実際にこのプロジェクト構成で組んでみようと思ったため、自分が行った手順を紹介します。

プロジェクト構成の概要

談義内で紹介されていたプロジェクト構成について、簡単に説明しておきます。

複数人で開発していると.xcodeprojがコンフリクトすることがあり、その解決策としてXcodeGenを使っているプロジェクトも多いと思います。
ただXcodeGenを使用するには学習コストがかかり、またproject.ymlの管理もしなければなりません。
そこでエントリポイント以外に関するコードをPackageに書くことで.xcodeprojに変更を加えずに開発することができます。

詳しく知りたい方は、一度本記事を読んでみてください。

構成手順

大きな流れとしては以下のようになります。

  1. workspaceの作成
  2. Staging projectとProduction projectの作成
  3. workspaceにxcodeprojを追加
  4. Packageを追加

1.Workspaceの作成

まずディレクトリを作成しておきます。

mkdir SwiftPMForiOS 

その後Xcodeを開き、「File」 -> 「New」 -> 「Workspace」から先程作成したディレクトリ配下にworkspaceを作成します。

2.Projectの作成

先にアプリケーション用のファイル/ディレクトリを配置するための、Appディレクトリを作成しておきます。

mkdir SwiftPMForiOS/App

次に「File」 -> 「New」 -> 「Project」でStaging用のprojectを作成します。
保存先は先程作成したworkspaceと同じ階層にしておきます。

ここまでの作業で現在の構成は以下のようになっていると思います。

Staging配下のものをApp配下に移動し、ディレクトリ名もiOSに変更しておきます。不要なStagingディレクトリは削除しておきます。すると以下のような構成になると思います。

この状態でStaging.xcodeprojを開くと以下のように赤くなっているので、Xcodeの右側にあるInspectorから正しいディレクトリ/ファイルのパスを指定してください。

またBuild Settingsの以下項目も修正しておきます。

項目名 変更前 変更後
Development Assets Staging/Preview Content" iOS/Preview Content
Info.plist File Staging/Info.plist iOS/Info.plist

上記と同様の手順でProduction用のprojectも作成してください。

Production用のproject作成時に自動生成されるProductionApp.swiftなどは削除し、Staging用のproject作成時のファイルを参照するほうが良さそうです。

4.WorkspaceにProjectを追加

「パッケージの内容を表示」からcontents.xcworkspacedataをエディタで開き、以下のような設定にしておきます。

<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "group:App/Staging.xcodeproj">
   </FileRef>
   <FileRef
      location = "group:App/Production.xcodeproj">
   </FileRef>
   <FileRef
      location = "group:">
   </FileRef>
</Workspace>

location = "group:"については、次のPackageを追加する際にXcodeから参照されるために必要なので、あらかじめ記述しておきます。
ここまでの作業で以下のような構成になっていると思います。

5.Packageを追加

Packageを以下のように追加します。

すると以下のような構成になるので、

SamplePackageディレクトリ配下のものをルートディレクトリ直下に移動し、SamplePackageディレクトリを削除します。

このままではAppディレクトリもPackageに含まれてしまうので、Appディレクトリ直下にPackage.swiftを用意し、以下を記述することで参照されないようにします。

import PackageDescription

let package = Package(
  name: "client",
  products: [],
  targets: []
)

Projectに作成したライブラリをリンクします。

最終的に以下の様な構成になります。

まとめ

今回紹介した構成のプロジェクトをgithubに上げて置いたので、良ければ参考にしてください。
また自分でプロジェクトを構成するのが面倒な方、リポジトリをzipでダウンロードしworkspace名とルートディレクトリ名を任意の名前に変更するとすぐ使うことができます。

https://github.com/yogita109/iOSTemplate

参考URL

Discussion

ログインするとコメントできます