Swift Package Manager(以降SwiftPM)がXcodeで正式サポートされてからCocoaPodsやCarthageからの移行を検討しているプロジェクトが増えてきています。
その際、大方の記事では以下のようにXcodeでパッケージを取り込む方法が紹介されます。
しかし、この方法で移行しようとして2つの課題に当たりました。
- リポジトリ毎にこの作業をする必要がある
- 複数のTARGETで同じパッケージを使用する時の動線が分かりづらい
(TARGET -> Build Phases -> Link Binary With Librariesから追加できる)
特に長く続いたプロジェクトでは当然それだけ多くのライブラリをCocoaPodsやCarthageで使用しており、SwiftPMへの手作業での移行は辛いものがあります。
(XcodeGenを使っていれば話は別ですがw)
そこで、iOSにおけるマルチモジュール開発の代表例として話題になったpointfreeco/isowordsをヒントに依存パッケージのみをまとめたパッケージを作成するアプローチを考えました。
手順
前提として、xcworkspace
上で開発しているものとします。
CocoaPodsを使っていれば必ず使っていますが、そうでない場合xcworkspaceが無い場合もあるので予め追加しておく必要があります。
まず、Project Navigatorの左下の +
ボタンからNew Packageを選びます。
パッケージ名を入れて Create
を押すと次の画像の通りworkspaceにパッケージが追加されます(ここではDependencies
というパッケージ名にしています)。
追加された Dependencies
パッケージはアプリTARGETの Link Binary With Libraries
から追加することで、 Dependencies
ターゲットで指定したパッケージを使用することができるようになります。
(下記画像のようにimportで補完もされることが確認できます)
ちなみに、Sources/Dependencies
には最低限1つ以上のSwiftファイルが必要になりますが、これは空のSwiftファイルでも問題ありません。
また、テスト用のライブラリもそれ用のターゲットを用意してあげれば別個に組み込むことができます。
まとめ
xcodeproj上でパッケージを管理するのではなく、Package.swiftに移譲する方法を紹介しました。
これによって、SwiftPMでのパッケージ管理をprogrammaticallyに行うことができます。
また今回は依存パッケージの移行が目的でしたが理論上はこのパッケージにプロダクトコードやテストコードも移行できるはずなので、将来的にisowordsのようなマルチモジュール開発への足がかりにもなると考えています。