LoginSignup
14
10

More than 1 year has passed since last update.

Swift Package ManagerをiOSで使う時はxcodeprojではなくPackage.swiftで読み込もう

Posted at

Swift Package Manager(以降SwiftPM)がXcodeで正式サポートされてからCocoaPodsやCarthageからの移行を検討しているプロジェクトが増えてきています。
その際、大方の記事では以下のようにXcodeでパッケージを取り込む方法が紹介されます。

しかし、この方法で移行しようとして2つの課題に当たりました。

  1. リポジトリ毎にこの作業をする必要がある
  2. 複数のTARGETで同じパッケージを使用する時の動線が分かりづらい
    (TARGET -> Build Phases -> Link Binary With Librariesから追加できる)

特に長く続いたプロジェクトでは当然それだけ多くのライブラリをCocoaPodsやCarthageで使用しており、SwiftPMへの手作業での移行は辛いものがあります。
(XcodeGenを使っていれば話は別ですがw)

そこで、iOSにおけるマルチモジュール開発の代表例として話題になったpointfreeco/isowordsをヒントに依存パッケージのみをまとめたパッケージを作成するアプローチを考えました。

手順

前提として、xcworkspace上で開発しているものとします。
CocoaPodsを使っていれば必ず使っていますが、そうでない場合xcworkspaceが無い場合もあるので予め追加しておく必要があります。

まず、Project Navigatorの左下の + ボタンからNew Packageを選びます。
image.png
パッケージ名を入れて Create を押すと次の画像の通りworkspaceにパッケージが追加されます(ここではDependenciesというパッケージ名にしています)。
image.png

追加された Dependencies パッケージはアプリTARGETの Link Binary With Libraries から追加することで、 Dependencies ターゲットで指定したパッケージを使用することができるようになります。
image.png
(下記画像のようにimportで補完もされることが確認できます)
image.png

ちなみに、Sources/Dependenciesには最低限1つ以上のSwiftファイルが必要になりますが、これは空のSwiftファイルでも問題ありません。

また、テスト用のライブラリもそれ用のターゲットを用意してあげれば別個に組み込むことができます。
image.png

まとめ

xcodeproj上でパッケージを管理するのではなく、Package.swiftに移譲する方法を紹介しました。
これによって、SwiftPMでのパッケージ管理をprogrammaticallyに行うことができます。

また今回は依存パッケージの移行が目的でしたが理論上はこのパッケージにプロダクトコードやテストコードも移行できるはずなので、将来的にisowordsのようなマルチモジュール開発への足がかりにもなると考えています。

参考

14
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10